JSON 路径表示法(JSON Path)是一种用于在 JSON 数据中定位和访问特定值的表达式语言。它类似于 XPath 对于 XML 数据的作用。
GitHub - json-path/JsonPath: Java JsonPath implementation
JSON 路径表示法中常用的一些符号和语法:
$
:表示根节点。.
:表示当前节点。..
:表示递归下降,用于匹配任意层级的节点。*
:表示通配符,匹配任意名称的节点。- @: 筛选器
[]
:用于索引和过滤节点。[,]
:用于多个索引或过滤条件。[start:end:step]
:用于切片操作,类似于 Python 中的切片语法。- [?(<expression>)] : 筛选表达式。表达式的计算结果必须为布尔值。
JSON 路径表中的表达式
- == :equal相等
- != : 不相等
- < :小于
- <= :小于等于
- >: 大于
- >= :大于等于
- =~ :正则表达式,左边值,右边正则表达式
- in :包含
- nin :不包含
- subsetof :子集
- anyof :相交
- noneof:不相交
- size:对象大小匹配,length或size
- empty :为空
JSON 路径表示法:
- $ :表示根节点
- . :表示当前节点
- $.data:表示获取当前节点中的data节点
- $..* :表示根节点下所有节点
- $.data[0].phone:data节点下第1个对象中的phone节点
- $.data[*].phone:data节点下所有对象中的phone节点
- $.data[:2].phone: data节点下前两个对象中的phone节点
- $.data[-1]:data节点最后一个节点
- $.data[-2:]:data节点最后两个节点
- $.store.book[?(@.price < 10)]:store中price值<10的book
- $..book[?(@.price <= $['expensive'])] 所有price值<expensive值的book
举例
json数据
{
"store": {
"book": [
{
"title": "Sayings of the Century",
"price": 8.95
},
{
"title": "Sword of Honour",
"price": 12.99
},
{
"title": "Moby Dick",
"price": 8.99
},
{
"title": "The Lord of the Rings",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
- $.store.book :所有book集合
- $.store.book[?(@.price > 10)] : price值大于10的所有book集合
- $.store.book[?(@.title == 'Sword of Honou')]: title等于 'Sword of Honou'的所有book集合
- $.store.book[?(@.title size 7)]:title字符串长度为7的所有book集合
- $.store[?(@.book.size() > 4)].book:book集合大于4的的所有book集合
使用方法
使用方法pom引入jar
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.6.0</version>
</dependency>
@Test
public void jsonPath() {
String json = "{" +
"\"data\":[" +
"{\"name\":\"John\",\"phone\":\"1234567890\"}," +
"{\"name\":\"Jane\",\"phone\":\"9876543210\"}" +
"]," +
"\"user\":{" +
"\"name\":\"lizz\"" +
"}," +
"\"code\":\"123\"" +
"}";
// 解析 JSON
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
// 当前节点下的code节点
String path = "$.code";
Object result = JsonPath.read(document, path);
System.out.println(result);
// 所有节点
path = "$..*";
result = JsonPath.read(document, path);
System.out.println(JSON.toJSONString(result));
// 执行data节点中所有phone节点
path = " $.data[*].phone";
result = JsonPath.read(document, path);
System.out.println(result);
// 执行data节点中index为1对象中的phone节点
path = "$.data[0].phone";
result = JsonPath.read(document, path);
System.out.println(result);
// 执行data节点中所有phone节点
path = " $.data[-1].phone";
result = JsonPath.read(document, path);
System.out.println(result);
}
结果
- Evaluating path: $['code']
123
- Evaluating path: $..[*]
[[{"name":"John","phone":"1234567890"},{"name":"Jane","phone":"9876543210"}],{"name":"lizz"},"123",{"$ref":"$[0][0]"},{"$ref":"$[0][1]"},"John","1234567890","Jane","9876543210","lizz"]
- Evaluating path: $['data'][*]['phone']
["1234567890","9876543210"]
- Evaluating path: $['data'][0]['phone']
1234567890
- Evaluating path: $['data'][-1]['phone']
9876543210