介绍
JsonPath
,类似于XPath
在XML
中的作用。其提供了对格式Json
数据的解析能力
操作符
$
查询的根节点,其中根节点可以是数组或对象.
或 ['name']
在JsonPath
表达式可以使用点语法、括号语法来访问子节点..
可进行递归搜索,例如:$..phone
['name'(, 'name')]
对于括号语法而言,其还支持访问多个子节点[ (, )]
针对数组元素的索引操作符[start:end]
针对数组元素的切片操作符,其表示获取索引在[start,end)区间范围的元素。*
通配符@
用于下文所述过滤器表达式当中,用于指代过滤器当前正在处理的节点对象。其效果类似于Java中的this关键字[?()]
过滤器表达式,表达式结果必须是布尔值。
过滤器支持地操作符,常见地有:
==
判断是否相等!=
判断是否不相等<
判断是否小于<=
判断是否小于等于>
判断是否大于>=
判断是否大于等于=~
判断左侧是否匹配右侧的正则in
判断左侧是否存在于右侧的集合中nin
判断左侧是否不存在于右侧的集合中subsetof
判断左侧是否为右侧集合的子集anyof
判断左侧是否与右侧集合存在交集noneof
判断左侧是否与右侧集合无交集size
判断左侧数组长度或字符串长度是否为指定值
常用语法
表达式 说明 $ 表示根元素 $.key 选择根元素下的指定键名的值 $.* 选择根元素下的所有属性值 $.array[*] 选择根元素中的数组的所有元素 $.key[subkey] 选择根元素中的键名为key,子键名为subkey的值 $.key[*].subkey 选择根元素中的键名为key的所有元素的子键名为subkey的值
过滤表达式
表达式 说明 $.key[?(@.subkey == value)] 选择根元素中key为指定值且具有subkey并且值等于value的元素 $.array[?(@.value > 10)] 选择根元素中值大于10的数组元素
范围表达式
表达式 说明 $.array[start:end] 选择根元素中从start索引到end索引之间的数组元素 $.array[:end] 选择根元素中从开头到end索引之间的数组元素 $.array[start:] 选择根元素中从start索引到末尾的数组元素
通配符表达式
表达式 说明 $.* 选择根元素下的所有键值对 $…key 选择根元素和所有子元素中的具有指定键名的值
操作符表达式
表达式 说明 $.key[?(@.value > 10 && @.value < 20)] 选择根元素中值大于10且小于20的key $.key[?(@.name =~ /pattern/)] 选择根元素中name符合正则表达式pattern的key
操作实战
{
"store" : {
"book" : [ {
"category" : "reference" ,
"author" : "Nigel Rees" ,
"title" : "Sayings of the Century" ,
"price" : 8.95
} , {
"category" : "fiction" ,
"author" : "Evelyn Waugh" ,
"title" : "Sword of Honour" ,
"price" : 12.99 ,
"isbn" : "0-553-21311-3"
} ] ,
"bicycle" : {
"color" : "red" ,
"price" : 19.95
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
引入依赖
< dependency>
< groupId> com.alibaba.fastjson2 groupId>
< artifactId> fastjson2 artifactId>
< version> 2.0.40 version>
dependency>
示例
public static void main ( String [ ] args) {
String jsonStr = "{ \"store\": {\"book\": [{ \"category\": \"reference\"," +
"\"author\": \"Nigel Rees\",\"title\": \"Sayings of the Century\"," +
"\"price\": 8.95},{ \"category\": \"fiction\",\"author\": \"Evelyn Waugh\"," +
"\"title\": \"Sword of Honour\",\"price\": 12.99,\"isbn\": \"0-553-21311-3\"" +
"}],\"bicycle\": {\"color\": \"red\",\"price\": 19.95}}}" ;
JSONObject jsonObject = JSON . parseObject ( jsonStr) ;
System . out. println ( jsonStr) ;
System . out. println ( "book数目:" + JSONPath . eval ( jsonObject, "$.store.book.size()" ) ) ;
System . out. println ( "第一本书的title:" + JSONPath . eval ( jsonObject, "$.store.book[0].title" ) ) ;
System . out. println ( "第一本书的category和author:" + JSONPath . eval ( jsonObject, "$.store.book[0]['category','author']" ) ) ;
System . out. println ( "price>10的书:" + JSONPath . eval ( jsonObject, "$.store.book[?(@.price > 10)]" ) ) ;
System . out. println ( "price>8的书的标题:" + JSONPath . eval ( jsonObject, "$.store.book[?(@.price > 8)]" ) ) ;
System . out. println ( "price>7的书:" + JSONPath . eval ( jsonObject, "$.store.book[?(@.price > 7)]" ) ) ;
System . out. println ( "price>7的书的标题:" + JSONPath . eval ( jsonObject, "$.store.book[?(@.price > 7)].title" ) ) ;
System . out. println ( "书的标题为Sayings of the Century:" + JSONPath . eval ( jsonObject, "$.store.book[?(@.title='Sayings of the Century')]" ) ) ;
System . out. println ( "bicycle的所有属性:" + JSONPath . eval ( jsonObject, "$.store.bicycle.*" ) ) ;
System . out. println ( "bicycle:" + JSONPath . eval ( jsonObject, "$.store.bicycle" ) ) ;
System . out. println ( "所有price:" + JSONPath . eval ( jsonObject, "$.store.book[*].price" ) ) ;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22