<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Snack3高性能 Jsonpath 框架

          聯(lián)合創(chuàng)作 · 2023-09-21 20:05

          一個高性能的 JsonPath 框架

          基于jdk8,80kb。支持:序列化反序列化、解析和轉(zhuǎn)換、構(gòu)建、查找、Json path 查詢。

          <dependency>
            <groupId>org.noear</groupId>
            <artifactId>snack3</artifactId>
            <version>3.2.26</version>
          </dependency>
           

          Snack3 借鑒了 Javascript 所有變量由 var 申明,及 Xml dom 一切都是 Node 的設(shè)計。其下一切數(shù)據(jù)都以ONode表示,ONode也即 One node 之意,代表任何類型,也可以轉(zhuǎn)換為任何類型。

          • 強調(diào)文檔樹的操控和構(gòu)建能力
          • 高性能Json path查詢(兼容性和性能很贊)
          • 支持序列化、反序列化
          • 基于 無參構(gòu)造函數(shù) + 字段 操作實現(xiàn)(因注入而觸發(fā)動作的風(fēng)險,不會有)

          隨便放幾個示例

          //demo0::字符串化
          String json = ONode.stringify(user); 
          
          //demo1::序列化
          // -- 輸出帶@type
          String json = ONode.serialize(user); 
          
          //demo2::反序列化
          // -- json 有已帶@type
          UserModel user = ONode.deserialize(json); 
          // -- json 可以不帶@type (clz 申明了)
          UserModel user = ONode.deserialize(json, UserModel.class); 
          // -- json 可以不帶@type,泛型方式輸出(類型是已知的)
          List<UserModel> list = ONode.deserialize(json, (new ArrayList<UserModel>(){}).getClass()); 
          
          //demo3::轉(zhuǎn)為ONode
          ONode o = ONode.loadStr(json); //將json String 轉(zhuǎn)為 ONode
          ONode o = ONode.loadObj(user); //將java Object 轉(zhuǎn)為 ONode
          
          //demo3.1::轉(zhuǎn)為ONode,取子節(jié)點進行序列化
          ONode o = ONode.loadStr(json);
          UserModel user = o.get("user").toObject(UserModel.class);
          
          
          //demo4:構(gòu)建json數(shù)據(jù)(極光推送的rest api調(diào)用)
          public static void push(Collection<String> alias_ary, String text)  {
              ONode data = new ONode().build((d)->{
                  d.getOrNew("platform").val("all");
          
                  d.getOrNew("audience").getOrNew("alias").addAll(alias_ary);
          
                  d.getOrNew("options")
                          .set("apns_production",false);
          
                  d.getOrNew("notification").build(n->{
                      n.getOrNew("ios")
                              .set("alert",text)
                              .set("badge",0)
                              .set("sound","happy");
                  });
              });
          
              String message = data.toJson();
              String author = Base64Util.encode(appKey+":"+masterSecret);
          
              Map<String,String> headers = new HashMap<>();
              headers.put("Content-Type","application/json");
              headers.put("Authorization","Basic "+author);
          
              HttpUtil.postString(apiUrl, message, headers);
          }
          
          //demo5:取值
          o.get("name").getString();
          o.get("num").getInt();
          o.get("list").get(0).get("lev").getInt();
          
          //demo5.1::取值并轉(zhuǎn)換
          UserModel user = o.get("user").toObject(UserModel.class); //取user節(jié)點,并轉(zhuǎn)為UserModel
          
          //demo5.2::取值或新建并填充
          o.getOrNew("list2").fill("[1,2,3,4,5,5,6]");
          
          
          //demo6::json path //不確定返回數(shù)量的,者會返回array類型
          //找到所有的187開頭的手機號,改為186,最后輸出修改后的json
          o.select("$..mobile[?(@ =~ /^187/)]").forEach(n->n.val("186")).toJson();
          //找到data.list[1]下的的mobile字段,并轉(zhuǎn)為long
          o.select("$.data.list[1].mobile").getLong();
          
          //查找所有手機號,并轉(zhuǎn)為List<String> 
          List<String> list = o.select("$..mobile").toObject(List.class);
          //查詢data.list下的所有mobile,并轉(zhuǎn)為List<String>
          List<String> list = o.select("$.data.list[*].mobile").toObject(List.class);
          //找到187手機號的用戶,并輸出List<UserModel>
          List<UserModel> list = o.select("$.data.list[?(@.mobile =~ /^187/)]")
                                  .toObjectList(UserModel.class);
          //或
          List<UserModel> list = o.select("$.data.list[?(@.mobile =~ /^187/)]")
                                  .toObjectList(UserModel.class);
          
          
          //demo7:遍歷
          //如果是個Object
          o.forEach((k,v)->{
            //...
          });
          //如果是個Array
          o.forEach((v)->{
            //...
          });
          
          
          //demo8:自定義編碼
          Options options = Options.def();
          options.addEncoder(Date.class, (data, node) -> {
              node.val().setString(DateUtil.format(data, "yyyy-MM-dd"));
          });
          
          String json = ONode.loadObj(orderModel, options).toJson();
           

          關(guān)于序列化的特點

          對象(可以帶type)

          {"a":1,"b":"2"}
          //或
          {"@type":"...","a":1,"b":"2"}
           

          數(shù)組

          [1,2,3]
          //或
          [{"@type":"...","a":1,"b":"2"},{"@type":"...","a":2,"b":"10"}]
           

          關(guān)于Json path的支持

          • 字符串使用單引號,例:['name']
          • 過濾操作用空隔號隔開,例:[?(@.type == 1)]
          支持操作 說明
          $ 表示根元素
          @ 當(dāng)前節(jié)點(做為過濾表達式的謂詞使用)
          * 通用配配符,可以表示一個名字或數(shù)字。
          .. 深層掃描。 可以理解為遞歸搜索。
          .<name> 表示一個子節(jié)點
          ['<name>' (, '<name>')] 表示一個或多個子節(jié)點
          [<number> (, <number>)] 表示一個或多個數(shù)組下標(biāo)(負(fù)號為倒數(shù))
          [start:end] 數(shù)組片段,區(qū)間為[start,end),不包含end(負(fù)號為倒數(shù))
          [?(<expression>)] 過濾表達式。 表達式結(jié)果必須是一個布爾值。
          支持過濾操作符(操作符兩邊要加空隔) 說明
          == left等于right(注意1不等于'1')
          != 不等于
          < 小于
          <= 小于等于
          > 大于
          >= 大于等于
          =~ 匹配正則表達式[?(@.name =~ /foo.*?/i)]
          in 左邊存在于右邊 [?(@.size in ['S', 'M'])]
          nin 左邊不存在于右邊
          支持尾部函數(shù) 說明
          min() 計算數(shù)字?jǐn)?shù)組的最小值
          max() 計算數(shù)字?jǐn)?shù)組的最大值
          avg() 計算數(shù)字?jǐn)?shù)組的平均值
          sum() 計算數(shù)字?jǐn)?shù)組的匯總值(新加的)

          例:n.select("$.store.book[0].title")  n.select("$['store']['book'][0]['title']")

          例:n.select("$..book.price.min()") //找到最低的價格

          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲网站在线免费观看 | 五月天啪啪啪 | 免费成人18禁 | 偷拍六区| 久操青青 |