一個作品,一般表達(dá)作者的一個想法。因為大家想法不同,所有作品會有區(qū)別。就做技術(shù)而言,因為有很多有區(qū)別的框架,所以大家可以選擇的框架很豐富。
snack3。基于jdk8,60kb,無其它依賴,非常小巧。
- 強(qiáng)調(diào)文檔樹的鏈?zhǔn)讲倏睾蜆?gòu)建能力
- 強(qiáng)調(diào)中間媒體,方便不同格式互轉(zhuǎn)
- 支持序列化、反序列化
- 支持Json path查詢
ONode 即 One node 之意;借簽了 JAVAscript 所有變量由 var 申明,及 Xml dom 一切都是 Node 的設(shè)計。這應(yīng)該也是與別的框架不同之處。
設(shè)計思路
- ONode是一個接口界面,內(nèi)部由nodeType和nodeData組成。通過nodeType進(jìn)行類型識別,通過nodeData容納所有的類型數(shù)據(jù)。
- 采用Fromer->ONode->Toer的架構(gòu)設(shè)計。這是重要的一個設(shè)計,可使轉(zhuǎn)換具有很強(qiáng)的擴(kuò)展能力,F(xiàn)romer 和 Toer 各做一半工作,也可各自切換(有好處也會有壞處)。
- 強(qiáng)調(diào)非null操作,通過o.isNull()進(jìn)行判斷(留意后面-get(key | idx)接口的注釋;可通過getOrNull(key | idx) 獲取 null )
項目源碼
- github:https://github.com/noear/snack3
- gitee:https://gitee.com/noear/snack3
Meven配置
<dependency> <groupId>org.noear</groupId> <artifactId>snack3</artifactId> <version>3.1.5.12</version> </dependency>
一、簡單的代碼演示
- 簡單操控
//1.加載json // name支持沒有引號 // 字符串支持單引號(在java里寫代碼方便點;輸出是標(biāo)準(zhǔn)的引號) ONode n = ONode.load("{code:1,msg:'Hello world',data:{list:[1,2,3,4,5]}}"); //2.1.取一個屬性的值 String msg = n.get("msg").getString(); //2.2.取列表里的一項 int li2 = n.get("data").get("list").get(2).getInt(); int li2 = n.select("data.list[2]").getInt(); //使用josn path //2.3.獲取一個數(shù)組 List<Integer> ary = n.get("data").get("list").toObject(ArrayList.class); List<Integer> ary = n.select("data.list").toObject(ArrayList.class); //使用josn path //3.1.設(shè)置值 n.set("msg","Hello world2"); n.get("msg").val("Hello world2"); //另一種設(shè)置方式 //3.2.設(shè)置列表里的一項值為12 n.get("data").get("list").get(2).val(12); n.select("data.list[2]").val(12); //使用josn path //3.3.清掉一個數(shù)組 n.get("data").get("list").clear(); n.select("data.list").clear(); //使用josn path
二、更多代碼演示
- 1.字符串化
//將 java object 轉(zhuǎn)為 json String json = ONode.stringify(user);
- 2.序列化
//1.序列化(通過@type申明類型) String json = ONode.serialize(user); //2.反序列化 UserModel user = ONode.deserialize(json, UserModel.class);
- 3.轉(zhuǎn)換
//1.1.將json string 轉(zhuǎn)為 ONode ONode o = ONode.load(json); //1.2.將java bean 轉(zhuǎn)為 ONode ONode o = ONode.load(user); //2.1.將 ONode 轉(zhuǎn)為 string(由轉(zhuǎn)換器決定,默認(rèn)轉(zhuǎn)換器為json) o.toString(); //2.2.將 ONode 轉(zhuǎn)為 json o.toJson(); //2.3.將 ONode 轉(zhuǎn)為XxxModel (例:UserModel) o.toObject(UserModel.class); //>將 ONode 轉(zhuǎn)為 Map 或 List 或 常規(guī)值 o.toObject(null); //>將 ONode 轉(zhuǎn)為 自動類型的 Java Object o.toObject(Object.class);
- 4.填充
ONode o = ONode.load("{code:1,msg:'Hello world!'}"); //填充java object List<UserModel> list = new ArrayList<>(); //... o.get("data").get("list").fill(list); //填充string json o.get("data").get("list").fill("[{a:1,b:2},{a:2,c:3}]");
- 5.一個應(yīng)用示例(極光推送的rest api調(diào)用)
public static void push(Collection<String> alias_ary, String text) { ONode data = new ONode().build((d)->{ d.get("platform").val("all"); d.get("audience").get("alias").addAll(alias_ary); d.get("options") .set("apns_production",false); d.get("notification").build(n->{ n.get("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); }
- 5.數(shù)據(jù)遍歷
//遍歷Object數(shù)據(jù) 方案1 o.forEach((k,v)->{ //... }); //遍歷Object數(shù)據(jù) 方案2 for(Map.Entry<String,ONode> kv : n.obj().entrySet()){ //... } //遍歷Array數(shù)據(jù) 方案1 o.forEach((v)->{ //... }); //遍歷Array數(shù)據(jù) 方案2 for(ONode v : o.ary()){ //.. }
三、混合加載與轉(zhuǎn)換代碼演示
List<UserModel> list = new ArrayList<>(); //.. ONode o = ONode.load("{code:1,msg:'succeed'}"); o.get("data").get("list").fill(list);
關(guān)于三組類型接口的設(shè)計(Json object,array,value)
- 關(guān)于json object的操作
-obj() -> Map<String,ONode> //獲取節(jié)點對象數(shù)據(jù)結(jié)構(gòu)體(如果不是對象類型,會自動轉(zhuǎn)換) -contains(key:String) -> bool //是否存在對象子節(jié)點? -get(key:String) -> child:ONode //獲取對象子節(jié)點(不存在,生成新的子節(jié)點并返回) -getOrNull(key:String) -> child:ONode //獲取對象子節(jié)點(不存在,返回null) -getNew(key:String) -> child:ONode //生成新的對象子節(jié)點,會清除之前的數(shù)據(jù) -set(key:String,val:Object) -> self:ONode //設(shè)置對象的子節(jié)點(會自動處理類型)//val:為常規(guī)類型或ONode -setNode(key:String,val:ONode) -> self:ONode //設(shè)置對象的子節(jié)點,值為ONode類型 -setAll(obj:ONode) -> self:ONode //設(shè)置對象的子節(jié)點,將obj的子節(jié)點搬過來 -setAll(map:Map<String,T>) ->self:ONode //設(shè)置對象的子節(jié)點,將map的成員搬過來 -setAll(map:Map<String,T>, (n,t)->..) ->self:ONode //設(shè)置對象的子節(jié)點,將map的成員搬過來,并交由代理處置 -remove(key:String) //移除對象的子節(jié)點 -forEach((k,v)->..) //遍歷對象的子節(jié)點
- 關(guān)于json array的操作
-ary() -> List<ONode> //獲取節(jié)點數(shù)組數(shù)據(jù)結(jié)構(gòu)體(如果不是數(shù)組,會自動轉(zhuǎn)換) -get(index:int) -> child:ONode //獲取數(shù)組子節(jié)點(超界,返回空節(jié)點) -getOrNull(index:int) -> child:ONode //獲取數(shù)組子節(jié)點(超界,返回null) -addNew() -> child:ONode //生成新的數(shù)組子節(jié)點 -add(val) -> self:ONode //添加數(shù)組子節(jié)點 //val:為常規(guī)類型或ONode -addNode(val:ONode) -> self:ONode //添加數(shù)組子節(jié)點,值為ONode類型 -addAll(ary:ONode) -> self:ONode //添加數(shù)組子節(jié)點,將ary的子節(jié)點搬過來 -addAll(ary:Collection<T>) -> self:ONode //添加數(shù)組子節(jié)點,將ary的成員點搬過來 -addAll(ary:Collection<T>,(n,t)->..) -> self:ONode //添加數(shù)組子節(jié)點,將ary的成員點搬過來,并交由代理處置 -removeAt(index:int) //移除數(shù)組的子節(jié)點 -forEach(v->..) //遍歷數(shù)組的子節(jié)點
- 關(guān)于json value的操作
-val() -> OValue //獲取節(jié)點值數(shù)據(jù)結(jié)構(gòu)體(如果不是值類型,會自動轉(zhuǎn)換) -val(val:Object) -> self:ONode //設(shè)置節(jié)點值 //val:為常規(guī)類型或ONode -getString() //獲取值并以string輸出 //如果節(jié)點為對象或數(shù)組,則輸出json -getShort() //獲取值并以short輸出...(以下同...) -getInt() -getBoolean() -getLong() -getDate() -getFloat() -getDouble() -getDouble(scale:int) -getChar()
關(guān)于序列化的特點
- 對象
{"@type":"...","a":1,"b":"2"}
- 數(shù)組(可以精準(zhǔn)反序列化列表類型;需要特性開啟)
[{"@type":"..."},[1,2,3]]