Snack3 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
Snack3 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
Snack3 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 Apache
开发语言 Java
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 梅子酒好吃
适用人群 未知
收录时间 2019-12-27

软件简介

一个高性能的 JsonPath 框架

基于jdk8,80kb。支持:序列化反序列化、解析和转换、构建、查找、Json path 查询。

<dependency>
  <groupId>org.noear</groupId>
  <artifactId>snack3</artifactId>
  <version>3.2.26</version>
</dependency>
 

Snack3 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。

  • 强调文档树的操控和构建能力
  • 高性能Json path查询(兼容性和性能很赞)
  • 支持序列化、反序列化
  • 基于 无参构造函数 + 字段 操作实现(因注入而触发动作的风险,不会有)

随便放几个示例

//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::转为ONode
ONode o = ONode.loadStr(json); //将json String 转为 ONode
ONode o = ONode.loadObj(user); //将java Object 转为 ONode

//demo3.1::转为ONode,取子节点进行序列化
ONode o = ONode.loadStr(json);
UserModel user = o.get("user").toObject(UserModel.class);


//demo4:构建json数据(极光推送的rest api调用)
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::取值并转换
UserModel user = o.get("user").toObject(UserModel.class); //取user节点,并转为UserModel

//demo5.2::取值或新建并填充
o.getOrNew("list2").fill("[1,2,3,4,5,5,6]");


//demo6::json path //不确定返回数量的,者会返回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);


//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();
 

关于序列化的特点

对象(可以带type)

{"a":1,"b":"2"}
//或
{"@type":"...","a":1,"b":"2"}
 

数组

[1,2,3]
//或
[{"@type":"...","a":1,"b":"2"},{"@type":"...","a":2,"b":"10"}]
 

关于Json path的支持

  • 字符串使用单引号,例:['name']
  • 过滤操作用空隔号隔开,例:[?(@.type == 1)]
支持操作 说明
$ 表示根元素
@ 当前节点(做为过滤表达式的谓词使用)
* 通用配配符,可以表示一个名字或数字。
.. 深层扫描。 可以理解为递归搜索。
.<name> 表示一个子节点
['<name>' (, '<name>')] 表示一个或多个子节点
[<number> (, <number>)] 表示一个或多个数组下标(负号为倒数)
[start:end] 数组片段,区间为[start,end),不包含end(负号为倒数)
[?(<expression>)] 过滤表达式。 表达式结果必须是一个布尔值。
支持过滤操作符(操作符两边要加空隔) 说明
== left等于right(注意1不等于'1')
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
=~ 匹配正则表达式[?(@.name =~ /foo.*?/i)]
in 左边存在于右边 [?(@.size in ['S', 'M'])]
nin 左边不存在于右边
支持尾部函数 说明
min() 计算数字数组的最小值
max() 计算数字数组的最大值
avg() 计算数字数组的平均值
sum() 计算数字数组的汇总值(新加的)

例:n.select("$.store.book[0].title")  n.select("$['store']['book'][0]['title']")

例:n.select("$..book.price.min()") //找到最低的价格

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击引领话题📣 发布并加入讨论🔥
发表了资讯
03/31 12:40

高性能 Jsonpath 框架,Snack3 3.2.90 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

8
2
发表了资讯
2023/09/20 13:05

🔥 Snack3 3.2.80 发布,高性能 Jsonpath 框架

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

1
3
发表了资讯
2023/05/19 08:18

高性能 Jsonpath 框架,Snack3 3.2.72 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

2
2
发表了资讯
2023/04/10 14:18

高性能 Jsonpath 框架,Snack3 3.2.65 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

0
4
发表了资讯
2023/03/04 11:59

高性能 Jsonpath 框架,Snack3 3.2.57 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

1
6
发表了资讯
2023/02/20 14:34

Snack3 v3.2.54 发布(支持 kotlin data 类反序化)

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

2
2
发表了资讯
2023/02/06 09:23

高性能 Jsonpath 框架,Snack3 v3.2.53 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

3
5
发表了资讯
2022/12/15 15:32

高性能 Jsonpath 框架,Snack3 3.2.50 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

0
4
发表了资讯
2022/10/13 10:15

高性能 Jsonpath 框架,Snack3 v3.2.44 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

0
2
发表了资讯
2022/09/07 15:53

高性能 Jsonpath 框架,Snack3 3.2.35 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

0
4
发表了资讯
2022/08/11 11:53

高性能 Jsonpath 框架,Snack3 3.2.33 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

2
9
发表了资讯
2022/06/16 22:08

高性能 Jsonpath 框架,Snack3 3.2.29 发布

Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 高性能Json path查询(顶级的兼容性和性能) 顺带支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) <dependency> <groupId>org.noe...

1
7
发表了资讯
2022/01/08 11:58

Snack3 3.2 发布,轻量的 Json+Jsonpath 框架

Snack3 是一个轻量的 JSON + Jsonpath 框架。 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。 强调文档树的操控和构建能力 做为中间媒体,方便不同格式互转 高性能Json path查询(兼容性和性能很赞) 支持序列化、反序列化 基于 无参构造函数 + 字段 操作实现(反序列化时不会有触发危险动作的风险) ...

0
3
发表了资讯
2021/12/23 15:33

Snack3 v3.2.4 已经发布,微型 JSON 框架

Snack3 v3.2.4 已经发布,微型 JSON 框架 此版本更新内容包括: 增加接口 ONode::getRawString() 增加接口 ONode::getRawNumber() 增加接口 ONode::getRawBoolean() 增加接口 ONode::getRawDate() 增加接口 Options::getFeatures() 增加 @ONodeAttr 注解,取代旧的 @Nodename Options 取消功能特性代码,只留配置特性 增加接口 ONode::options(ops->...); 取消 Act0, Act1, Fun0, Fun4 临时功能接口 增加更复杂的泛型传导 详情查...

0
1
发表了资讯
2021/10/12 12:05

Snack3 v3.2.0 发布,微型 JSON 框架

Snack3 v3.2.0 已经发布,微型 JSON 框架。 此版本更新内容包括: Constants 更名为 Options,并优化细节 ONode::get(key) ,不再自动为文档树添加节点;如有需要改用 ONode::getOrNew(key) 增加自定义编码与解码支持 import org.noear.snack.core.Options; import java.util.Date; public class DemoTest { public void test(UserDto user) { Options options = Options.def(); options.addEn...

0
1
发表了资讯
2021/05/21 11:09

Snack3 v3.1.17 发布,微型 JSON 框架

Snack3 v3.1.17 已经发布,此版本更新内容包括: 完全改造为基于 无参构函数 和 字段的操作,避免因数据注入而诱发恶意动作。 Snack3 for java 一个微型JSON + Jsonpath框架 基于jdk8,70kb。支持:序列化反序列化、解析和转换、Json path 查询。 <dependency> <groupId>org.noear</groupId> <artifactId>snack3</artifactId> <version>3.1.17</version> </dependency> Snack3 借鉴了 Javascript 所有变量由 var 申...

0
6
2020/09/04 10:33

Snack3 3.1.10 发布,国产 JSON, Jsonpath 框架

一个微型JSON框架 基于jdk8,70kb。有序列化反序列化、解析和转换、支持 Json path 查询。 <dependency> <groupId>org.noear</groupId> <artifactId>snack3</artifactId> <version>3.1.10</version> </dependency> 更新说明: 增加特性:Feature.StringJsonToNode 支持处理节点值为jsonstring的情况 增加接口:ONode::fillObj(),ONode::fillStr() 支持快速填充Java bean或Json string数据 增加接口能力:ONode::se...

7
4
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
0 评论
28 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部