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

  • 相关阅读:
    改变form里面input,textarea.select等的默认样式
    serialize() 方法
    纯css实现互动清单
    less学习笔记
    竖直手风琴导航菜单栏
    植树节快到了-那就种棵决策树吧
    简单写个logictic回归
    爬取纽约时报特定关键词新闻并计数
    (数学建模)非线性规划
    (CV学习笔记)看图说话(Image Captioning)-2
  • 原文地址:https://www.cnblogs.com/c-x-a/p/11673523.html
Copyright © 2011-2022 走看看