一、对于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格式的数据拷贝上去,自己手动写表达式解析查看。