Silentdoer

导航

JSON如何处理-jsonpath使用举例

目录

一、简介

二、JSONPath语法元素和对应XPath元素的对比

三、jsonpath使用举例

四、过滤器

五、在线解析器

参考
一、简介

    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     

所有学历的name
      $.[*].id     

所有的id
      $.[*]     

所有元素
      $.[(@.length-2)].name     

倒数第二个元素的name
      $.[2]     

第三个元素
      $.[(@.length-1)]     最后一个元素
      $.[0,1]

$.[:2]
    前面的两个元素
      $.[?(@.name =~ /.*中/i)]      过滤出所有的name包含“中”的书。
      $..book[?(@.price<10)]     过滤出价格低于10的书。
      $.[*].length()     

所有元素的个数

接口返回:

    {
        "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

$..author     [
“Nigel Rees”,
“Evelyn Waugh”,
“Herman Melville”,
“J. R. R. Tolkien”
]
$.store.* 显示所有叶子节点值     [
[
{
”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
}
],
{
”color” : “red”,
”price” : 19.95
}
]
$.store..price     [
8.95,
12.99,
8.99,
22.99,
19.95
]
$..book[0,1]

$..book[:2]     [
{
”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
}
]
$..book[-2:]     获取最后两本书
$..book[2:]     [
{
”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
}
]
$..book[?(@.isbn)]     所有具有isbn属性的书
$.store.book[?(@.price < 10)]     所有价格小于10的书
$..book[?(@.price <= $[‘expensive’])]     所有价格低于expensive字段的书
$..book[?(@.author =~ /.*REES/i)]     所有符合正则表达式的书
[
{
”category” : “reference”,
”author” : “Nigel Rees”,
”title” : “Sayings of the Century”,
”price” : 8.95
}
]
$..*     返回所有
$..book.length()     [
4
]
四、过滤器
操作符     描述
==     等于符号,但数字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://testerhome.com/topics/6681
五、在线解析器

http://jsonpath.com/

https://jsonpath.curiousconcept.com/
参考

https://goessner.net/articles/JsonPath/

https://www.cnblogs.com/aoyihuashao/p/8665873.html

https://blog.csdn.net/luxideyao/article/details/77802389
————————————————
版权声明:本文为CSDN博主「多则惑少则明」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huazhongkejidaxuezpp/article/details/84728342

posted on 2020-01-19 14:45  Silentdoer  阅读(889)  评论(0编辑  收藏  举报