Snack3,一個高性能的 JsonPath 架構
借鑒了 Javascript 所有變量由 var 申明,及 Xml dom 一切都是 Node 的設計。其下一切資料都以ONode表示,ONode也即 One node 之意,代表任何類型,也可以轉換為任何類型。
- 強調文檔樹的操控和建構能力
- 高性能Json path查詢(頂級的相容性和性能)
- 順帶支援序列化、反序列化
- 基于 無參構造函數 + 字段 操作實作(反序列化時不會有觸發危險動作的風險)
<dependency>
<groupId>org.noear</groupId>
<artifactId>snack3</artifactId>
<version>3.2.29</version>
</dependency>
本次累計更新:
- 增加對 Properties 數組的轉換支援
- 增加 @ONodeAttr(ignore,incNull)
- 增加特性:Feature.TransferCompatible (傳輸相容處理)
- 增加對 isFinal 字段的注入支援
- 當類型為 interface 時,支援将 string 自動轉換為 object
- 優化異常處理
- 增加 新特性 UseSetter(即允許使用 setXxx)
- 枚舉支援字元大小寫
- 增加字元串 "true" 轉為 Boolean
- 增新加特性 Feature.DisThreadLocal
- 增加嵌套泛型反序列化支援
- 增加對 kotlin data class 和 jdk14+ record 的序列化與反序列化支援
簡單示範:
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);
項目位址:
- https://gitee.com/noear/snack3
- https://github.com/noear/snack3