一、对于json数据的解析
简介
- JSONPath - 是xpath在json的应用。
类似于XPath在xml文档中的定位,JsonPath表达式通常是用来路径检索或设置Json的。其表达式可以接受“dot–notation”和“bracket–notation”格式,例如$.store.book[0].title、$[‘store’][‘book’][0][‘title’]
- JSONPath 表达式
- JSONPaht 用一个抽象的名字$来表示最外层对象。
- 使用.符号:$.store.book[0].title
- 使用[]:$['store']['book'][0]['title']
- 数组索引
1)JSONPath 允许使用通配符 * 表示所以的子元素名和数组索引。还允许使用 '..' 从E4X参照过来的和数组切分语法[start:end:step]
2
)
$.store.book[(@.length-1)].title
3)使用'@'符号表示当前的对象,?(<判断表达式>) 使用逻辑表达式来过滤
$.store.book[?(@.price < 10)].title
二、JSONPath语法元素和对应XPath元素的对比
XPath |
JSONPath |
Description |
/ |
$ |
表示根元素 |
. |
@ |
当前元素 |
/ |
. or [] |
子元素 |
.. |
n/a |
父元素 |
// |
.. |
递归下降,JSONPath是从E4X借鉴的。 |
* |
* |
通配符,表示所有的元素 |
@ |
n/a |
属性访问字符 |
[] |
[] |
子元素操作符 |
| |
[,] |
连接操作符在XPath 结果合并其它结点集合。JSONP允许name或者数组索引。 |
n/a |
[start:end:step] |
数组分割操作从ES4借鉴。 |
[] |
?() |
应用过滤表示式 |
n/a |
() |
脚本表达式,使用在脚本引擎下面。 |
() |
n/a |
Xpath分组 |
三、jsonpath使用举例
接口返回:
- [{
- "id": "PRIMARY",
- "name": "小学",
- "front_id": "PRIMARY",
- "front_name": "小学"
- }, {
- "id": "JUNIOR",
- "name": "初中",
- "front_id": "JUNIOR",
- "front_name": "初中"
- }, {
- "id": "HIGH",
- "name": "高中",
- "front_id": "HIGH",
- "front_name": "高中"
- }, {
- "id": "TECHNICAL",
- "name": "中专/技校",
- "front_id": "TECHNICAL",
- "front_name": "中专/技校"
- }, {
- "id": "COLLEGE",
- "name": "大专",
- "front_id": "COLLEGE",
- "front_name": "大专"
- }, {
- "id": "BACHELOR",
- "name": "本科",
- "front_id": "BACHELOR",
- "front_name": "本科"
- }, {
- "id": "MASTER",
- "name": "硕士",
- "front_id": "MASTER",
- "front_name": "硕士"
- }, {
- "id": "DOCTOR",
- "name": "博士",
- "front_id": "DOCTOR",
- "front_name": "博士"
- }]
JSONPath |
结果 |
|
|
所有学历的name |
|
|
所有的id |
|
|
所有元素 |
|
|
倒数第二个元素的name |
|
|
第三个元素 |
|
|
最后一个元素 |
|
|
前面的两个元素 |
|
|
过滤出所有的name包含“中”的书。 |
|
|
过滤出价格低于10的书。 |
|
|
所有元素的个数 |
接口返回:
- {
- "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
- }
- },
- "expensive": 10
- }
JsonPath表达式 |
结果 |
$.store.book[*].author |
[ |
$.store.* 显示所有叶子节点值 |
[ |
$.store..price |
[ |
$..book[0,1] |
[ |
$..book[-2:] |
获取最后两本书 |
$..book[2:] |
[ |
$..book[?(@.isbn)] |
所有具有isbn属性的书 |
$.store.book[?(@.price < 10)] |
所有价格小于10的书 |
$..book[?(@.price <= $[‘expensive’])] |
所有价格低于expensive字段的书 |
$..book[?(@.author =~ /.*REES/i)] |
所有符合正则表达式的书 |
$..* |
返回所有 |
$..book.length() |
[ |
四、过滤器
操作符 |
描述 |
== |
等于符号,但数字1不等于字符1(note that 1 is not equal to ‘1’) |
!= |
不等于符号 |
< |
小于符号 |
<= |
小于等于符号 |
> |
大于符号 |
>= |
大于等于符号 |
=~ |
判断是否符合正则表达式,例如[?(@.name =~ /foo.*?/i)] |
in |
所属符号,例如[?(@.size in [‘S’, ‘M’])] |
nin |
排除符号 |
size |
size of left (array or string) should match right |
empty |
判空符号 |
例如:
1)所有具有isbn属性的书
$.store.book[?(@.isbn)].author
2)所有价格大于10的书
$.store.book[?(@.price >
10)]
3)查询xxx==3的所有对象
$.result.list[?(@.xxx ==3)]
4)可以自定义过滤器来获取想要的任何元素,可以多条件查询
五、在线解析器
https://jsonpath.curiousconcept.com/
在这里,你可以将你的json格式的数据拷贝上去,自己手动写表达式解析查看。