Snack3 之 Jsonpath使用
标签:
Snack3 之 Jsonpath使用 一、 Snack3 和 JSONPath 介绍Snack3 是一个支持JSONPath的JSON框架。JSONPath是一个很强大的功能,也可以在Java框架中当作对象查询语言(OQL)来使用。
<dependency> <groupId>org.noear</groupId> <artifactId>snack3</artifactId> <version>3.1.5.10</version> </dependency>Snack3 借签了 Javascript 所有变量由 var 申明,,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。
强调文档树的操控和构建能力
做为中间媒体,方便不同格式互转
高性能Json path查询(兼容性和性能很赞)
支持序列化、反序列化
二、接口 public class ONode{ //... /** * Json path select * * @param jpath json path express * @param useStandard use standard mode(default: false) * @param cacheJpath cache json path parsing results */ public ONode select(String jpath, boolean useStandard, boolean cacheJpath) { return JsonPath.eval(this, jpath, useStandard, cacheJpath); } public ONode select(String jpath, boolean useStandard) { return select(jpath, useStandard, true); } public ONode select(String jpath) { return select(jpath, false); } //... }默认使用缓存JSONPath解析对象,可提供几倍性能效果。
三、支持语法字符串使用单引号,例:[‘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() 计算数字数组的汇总值(新加的)
像这两种写法的语义是差不多:
$.store.book[0].title //建议使用这种 $['store']['book'][0]['title'] 四、语法示例说明 JSONPath 说明$ 根对象
$[-1] 最后元素
$[:-2] 第0个至倒数第2个
$[1:] 第1个之后所有元素(0为首个)
$[1,2,3] 集合中1,2,3个元素(0为首个)
五、接口使用示例 示例1:
读取对象的属性
Entity entity = new Entity(123, new Object()); ONode n = ONode.load(entity); assert n.select("$.id").getInt() == 123; assert n.select("$.*").count() == 2; public static class Entity { public int id; public String name; public Object value; public Entity(int id, Object value) { this.id = id; this.value = value; } public Entity(String name) { this.name = name; } } 示例2读取集合多个元素的某个属性
List<Entity> entities = new ArrayList<Entity>(); entities.add(new Entity("wenshao")); entities.add(new Entity("ljw2083")); ONode n = ONode.load(entities); List<String> names = n.select("$.name").toObject(List.class); assert names.size() == 2; 示例3温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/41499.html