一个作品,一般表达作者的一个想法 。因为大家想法不同,所有作品会有区别 。就做技术而言,因为有很多有区别的框架,所以大家可以选择的框架很丰富 。
snack3 。基于jdk8,60kb,无其它依赖,非常小巧 。
- 强调文档树的链式操控和构建能力
- 强调中间媒体,方便不同格式互转
- 支持序列化、反序列化
- 支持Json path查询
ONode 即 One node 之意;借签了 JAVAscript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计 。这应该也是与别的框架不同之处 。
设计思路
- ONode是一个接口界面,内部由nodeType和nodeData组成 。通过nodeType进行类型识别,通过nodeData容纳所有的类型数据 。
- 采用Fromer->ONode->Toer的架构设计 。这是重要的一个设计,可使转换具有很强的扩展能力,Fromer 和 Toer 各做一半工作,也可各自切换(有好处也会有坏处) 。
- 强调非null操作,通过o.isNull()进行判断(留意后面-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里写代码方便点;输出是标准的引号)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.获取一个数组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.设置值n.set("msg","Hello world2");n.get("msg").val("Hello world2"); //另一种设置方式//3.2.设置列表里的一项值为12n.get("data").get("list").get(2).val(12);n.select("data.list[2]").val(12); //使用josn path //3.3.清掉一个数组n.get("data").get("list").clear();n.select("data.list").clear(); //使用josn path 二、更多代码演示
//将 java object 转为 jsonString json = ONode.stringify(user);
//1.序列化(通过@type申明类型)String json = ONode.serialize(user);//2.反序列化UserModel user = ONode.deserialize(json, UserModel.class);
//1.1.将json string 转为 ONodeONode o = ONode.load(json); //1.2.将java bean 转为 ONodeONode o = ONode.load(user); //2.1.将 ONode 转为 string(由转换器决定,默认转换器为json)o.toString();//2.2.将 ONode 转为 jsono.toJson();//2.3.将 ONode 转为XxxModel (例:UserModel)o.toObject(UserModel.class);//>将 ONode 转为 Map 或 List 或 常规值o.toObject(null);//>将 ONode 转为 自动类型的 Java Objecto.toObject(Object.class);
ONode o = ONode.load("{code:1,msg:'Hello world!'}");//填充java objectList<UserModel> list = new ArrayList<>();//...o.get("data").get("list").fill(list);//填充string jsono.get("data").get("list").fill("[{a:1,b:2},{a:2,c:3}]");
- 5.一个应用示例(极光推送的rest api调用)
public static void push(Collection<String> alias_ary, String text) { ONode data = https://www.isolves.com/it/cxkf/kj/2019-12-11/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
headers = new HashMap<>(); headers.put("Content-Type","application/json"); headers.put("Authorization","Basic "+author); HttpUtil.postString(apiUrl, message, headers);}//遍历Object数据 方案1o.forEach((k,v)->{ //...});//遍历Object数据 方案2for(Map.Entry<String,ONode> kv : n.obj().entrySet()){ //... }//遍历Array数据 方案1o.forEach((v)->{ //...});//遍历Array数据 方案2for(ONode v : o.ary()){ //..}三、混合加载与转换代码演示List<UserModel> list = new ArrayList<>();//..ONode o = ONode.load("{code:1,msg:'succeed'}");o.get("data").get("list").fill(list);
推荐阅读
-
-
猪肉会降到十几元一斤吗,猪肉还会跌到10元一斤吗-
-
『上游新闻』重庆几百名家长炸锅了:找谁退款?,儿童体能培训机构“趣动旅程”说垮就垮
-
感知|Apollo无人驾驶电动巴士亮相引市民争相围观体验
-
ipada1822是ipad几代几寸,ipada1822是ipad几代停产啦吗-
-
「成都房地产高级顾问」从川A吃到川Z,吃得你流口水看得你吞舌头
-
:一旦发现工人这样装插座,立马赶他出门,一分钱也不要给!
-
销量|比亚迪股份盘中市值突破5000亿港元,创历史新高
-
晗妈育儿经|离开电视就哭闹,常看电视危害大,孩子沉迷动画
-
猫眼娱乐V|身材发福但风韵犹存,62岁胡慧中近照认不出!面部严重变形
-
烹饪|三伏天必备开胃小食,2块钱做一大盘,香酥可口,简单零失败
-
林志玲|突发!网传林志玲遭家暴照片,假体被打出,日籍老公多次出轨!
-
[]126斤宝妈这样吃早餐一周瘦3斤,吃得满足还不挨,4天早餐大公开
-
“车轮”赋能传统驾驶培训产业——“驾考+”加了什么
-
卡通|《向往的生活5》海报提前曝光,嘉宾卡通图成亮点,他将被替换掉
-
中国|阿里巴巴宣布拟280亿港元控股大润发母公司高鑫零售
-
外墙裂缝渗漏应该如何治理? 外墙裂缝漏水该怎么处理
-
「黑客」浏览“不良网站”很开心?实际你早已被黑客利用,隐私也已泄露
-
心态|爱追涨杀跌、有赌博心态,买得越少亏得越多,关于A股散户,这篇论文说…
-
林志颖近照暴瘦,裤管空荡膝盖骨凸出,术后痕迹明显,面部不自然