Snack3高性能 Jsonpath 框架
一個高性能的 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()") //找到最低的價格
評論
圖片
表情
