zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    算法经典文章收藏
    Python 学习文章收藏
    Leetcode 刷题计划
    CLR via C# 学习计划
    算法导论 学习计划
    算法导论学习笔记 一 分治算法
    Mongodb 学习笔记
    Python模拟HttpRequest的方法总结
    在Github上搭建自己的博客(Windows平台)
    Git Shell 基本命令(官网脱水版)
  • 原文地址:https://www.cnblogs.com/silentdoer/p/12213638.html
Copyright © 2011-2022 走看看