JsonPath
概述
JSONPath - 用于JSON的XPath
用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具.
JsonPath有许多编程语言,如Javascript、Python、PHP、Java等,这里主要总结的是Java的
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。
简单的来说,JsonPath就是用来解析json数据的,主要是使用JsonPath表达式去解析,
表达式
- JsonPath表达式有两种写法,一种是使用点进行表达
$.store.book.[0]
- 还有一种是使用中括号进行表达
$['store']['book'][0]
- 两种表达式的效果是一样的
json
{ "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
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
语法
JSONPath | 描述 |
$ | 根节点,用于表示当前的json对象,可以是数组也可以是对象 |
@ | 过滤器断言(filter predicate)处理的当前节点对象,类似于java中的this字段, |
* | 通配符,用于匹配所有的元素,比如匹配数组下的所有元素,可以表示一个名字或数字 |
… | 递归匹配对应的字段,因为可能会匹配到多个字段,所以最外面都是用[]括起来 |
.或者[] | 表示一个子节点 |
[start: end] | 数组片段,区间为[start,end),不包含end |
?() | 支持过滤操作 |
[] | 数组,里面可以填写一个数组下标,也可以使用逗号隔开填多个 |
举例演示
JsonPath | 描述 | |
$.store.book[*].author | 商店中所有书籍的作者 | |
$…author | 所有作者 | |
$.store.* | 商店里的所有东西,都是一些书和一辆红色的自行车。 | |
$.store…price | 商店里一切的价格。 | |
$…book[2] | 第三本书 | |
…book[-1:] | 最后一本书。 | |
…book[:2] | 前两本书 | |
$…book[?(@.isbn)] | 用isbn number过滤所有书籍 | |
$…book[?(@.price<10)] | 过滤所有便宜10以上的书籍 | |
$…* | XML文档中的所有元素。JSON结构的所有成员。 | |
$…book.length() | 获取json中book数组的长度 | |
$…book[?(@.author =~ /.*REES/i)] | 获取json中book数组中的作者以REES结尾的所有值(REES不区分大小写) |
代码演示
// 获取json中store下book下的所有title值
List<String> titless = JsonPath.read(json, "$.store.book[*].title");
System.out.println("$.store.book.title \n " + titless);
System.out.println();
// 获取json中所有title的值
List<String> title = JsonPath.read(json, "$..title");
System.out.println("$..title \n" + title);
System.out.println();
// 获取json中book数组中包含isbn的所有值
List<Book> isbn = JsonPath.read(json, "$.store.book[?(@.isbn)]");
System.out.println("$.store.book[?(@.isbn)] \n" + isbn);
System.out.println();
// 获取json中book数组中不包含isbn的所有值
isbn = JsonPath.read(json, "$.store.book[?(!@.isbn)]");
System.out.println("$.store.book[?(!@.isbn)] \n" + isbn);
System.out.println();
// 获取json中book数组中price<10的所有值
List<Double> prices = JsonPath.read(json, "$.store.book[?(@.price < 10)].price");
System.out.println("$.store.book[?(@.price < 10)].price \n" + prices);
System.out.println();
// 获取json中book数组中的title等于“高效Java”的对象
List<Book> titles = JsonPath.read(json, "$.store.book[?(@.title == 'The Lord of the Rings')]");
System.out.println("$.store.book[?(@.title == 'The Lord of the Rings')] \n" + titles);
System.out.println();
// 获取json中store下所有price的值
prices = JsonPath.read(json, "$..price");
System.out.println("$..price \n" + prices);
System.out.println();
// 获取json中book数组的前两个区间值
List<Book> book = JsonPath.read(json, "$.store.book[0:4]");
System.out.println("$.store.book[2:4] \n" + book);
System.out.println();
// 获取书个数
int size = JsonPath.read(json, "$.store.book.size()");
System.out.println("$.store.book.size() \n" + size);
System.out.println();
// 获取store中bicycle的颜色
List<String> color = JsonPath.read(json, "$.store..color");
System.out.println("$.store..color \n" + color.get(0));
引入依赖
<!--在maven项目中maven维护了一个json-path版本为2.4.0-->
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
</dependency>
<!--完整-->
<!-- https://mvnrepository.com/artifact/com.jayway.jsonpath/json-path -->
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.4.0</version>
</dependency>