Snack3,一個高效能的 JsonPath 框架
借鑑了 Javascript 所有變數由 var 申明,及 Xml dom 一切都是 Node 的設計。其下一切資料都以ONode表示,ONode也即 One node 之意,代表任何型別,也可以轉換為任何型別。
- 強調文件樹的操控和構建能力
- 高效能Json path查詢(頂級的相容性和效能)
- 順帶支援序列化、反序列化
- 基於 無參建構函式 + 欄位 操作實現(反序列化時不會有觸發危險動作的風險)
<dependency>
<groupId>org.noear</groupId>
<artifactId>snack3</artifactId>
<version>3.2.57</version>
</dependency>
本次累計更新:
- 增加 ClassLoader 自動指定能力
- 增加 @NodeAttr 對 LocalTime,LocalDate,LocalDateTime 有效
- 增加 selectOrNew() 介面,可根據 jsonpath 表示式構建結構;
ONode oNode = new ONode();
oNode.selectOrNew("$.orders[0].price").val(500);
System.out.println(oNode.toJson());
//{"orders":[{"price":500}]}
簡單演示:
ONode o = ONode.loadStr(json); //將json String 轉為 ONode
ONode o = ONode.loadObj(user); //將java Object 轉為 ONode
//不確定返回數量的,者會返回array型別
//找到所有的187開頭的手機號,改為186,最後輸出修改後的json
o.select("$..mobile[?(@ =~ /^187/)]").forEach(n->n.val("186")).toJson();
//找到data.list[1]下的的mobile欄位,並轉為long
o.select("$.data.list[1].mobile").getLong();
//查詢所有手機號,並轉為List<String>
List<String> list = o.select("$..mobile").toObject(List.class);
//查詢data.list下的所有mobile,並轉為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);