zoukankan      html  css  js  c++  java
  • 解析复杂的嵌套数据结构-jsonpath

    JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和PHP,Java。

    JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。

    Json结构清晰,可读性高,复杂度低,非常容易匹配,其结合方式类似Xpath,为了方便记忆
    下表中列出了对应了JSONPath以及对应的XPath用法。

    XPath JSONPath 描述
    / $ 根节点
    . @ 现行节点
    / .or[] 取子节点
    .. n/a 取父节点,Jsonpath未支持
    // .. 就是不管位置,选择所有符合条件的条件
    * * 匹配所有元素节点
    @ n/a 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要属性访问。
    [] [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
    | [,] 支持迭代器中做多选。
    [] ?() 支持过滤操作.
    n/a () 支持表达式计算
    () n/a 分组,JsonPath不支持

    使用规则

    JsonPath表达式可以使用点表示法

    $.store.book [0].title
    

    或括号表示法

    $['store']['book'][0]['title']
    

    前面我们提到了jsonpath目前支持多种语言,下面我们以Python为例子进行使用。

    安装

    pip install jsonpath
    

    使用方法

    import jsonpath
    res=jsonpath.jsonpath(dic_name,'$..key_name')
    

    嵌套n层也能取到所有key_name信息,其中:$表示最外层的{},..表示模糊匹配,当传入不存在的key_name时,程序会返回false.

    XPath JSONPath 结果
    /store/book/author $.store.book[*].author 商店里所有书籍的作者
    //author $..author 所有作者
    /store/* $.store.* 商店里的所有东西,都是一些书和一辆红色的自行车。
    /store//price $.store..price 商店里一切的价格。
    //book[3] $..book[2] 第三本书
    //book[last()] $..book[(@.length-1)]或者$..book[-1:] 最后一本书。
    //book[position()<3] $..book[0,1]或者$..book[:2] 前两本书
    //book[isbn] $..book[?(@.isbn)] 使用isbn number过滤所有书籍
    //book[price<10] $..book[?(@.price<10)] 过滤所有便宜10以上的书籍
    //* $..* XML文档中的所有元素。JSON结构的所有成员。

    综合案例

    shop={
        "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
    }
    
    import jsonpath
    #商店里所有书籍的作者
    author_list=jsonpath.jsonpath(shop,'$.store.book[*].author')
    print(author_list) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']
    
    #返回所有的作者
    author_list2=jsonpath.jsonpath(shop,'$..author')
    print(author_list2) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J
    
    #商店里的所有东西
    category_dx=jsonpath.jsonpath(shop,'$.store.*')
    print(category_dx)
    
    #商店里一切的价格
    store_price_list=jsonpath.jsonpath(shop,'$.store..price')
    print(store_price_list) #[8.95, 12.99, 8.99, 22.99, 19.95]
    
    #第三本书
    book_3=jsonpath.jsonpath(shop,'$..book[2]')
    print(book_3)
    
    #最后一本书
    num=len(jsonpath.jsonpath(shop,'$..book'))-1
    book_last=jsonpath.jsonpath(shop,f'$..book[{num}]')
    print(book_last)
    
    #前两本书
    book_12=jsonpath.jsonpath(shop,f'$..book[0,1]')
    print(book_12)
    
    #过滤所有便宜10以上的书籍
    book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.price<10)]')
    print(book_lg10)
    
    #使用isbn number过滤所有书籍
    book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.isbn)]')
    print(book_lg10)
    

    参考资料

    https://blog.csdn.net/xlengji/article/details/81023368
    https://www.cnblogs.com/angle6-liu/p/10580792.html

  • 相关阅读:
    mysql 远程登陆不上
    hdu 5339 Untitled【搜索】
    SqlServer 书目
    passwordauthentication yes
    oracle 11g RAC ocfs2
    Oracle 11g RAC database on ASM, ACFS or OCFS2
    CentOS ips bonding
    Oracle 11g RAC features
    openStack 王者归来之 trivial matters
    openstack windows 2008 img
  • 原文地址:https://www.cnblogs.com/c-x-a/p/11673523.html
Copyright © 2011-2022 走看看