zoukankan      html  css  js  c++  java
  • jsonpath 使用教程(快速处理dict的深度查询)

    一 简介

    • JSONPath - 用于JSON的XPath

    • 用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具.

    二 安装

            安装方法:pip install jsonpath
         
            官方文档:http://goessner.net/articles/JsonPath

    三 强大之处

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


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

    四 jsonpath表达式

    • 使用注释
    $.store.book[0].title 
    • 括号 -注释
    $['store']['book'][0]['title']

    五 jsonpath与xpath的联系

      JSONPath语法元素与XPath对应的完整概述和并排比较。

    XpathJSONPath描述
    / $ 跟节点
    . @ 现行节点
    / . or [] 取子节点
    .. n/a 就是不管位置,选择所有符合条件的条件
    * * 匹配所有元素节点
    [] [] 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)
    &#124 [,] 支持迭代器中做多选
    [] ?() 支持过滤操作
    n/a () 支持表达式计算
    () n/a 分组,JsonPath不支持

    六 实例演示

    { "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
        }
      }
    }
    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结构的所有成员。

    python使用示例

    使用格式:

    jsonpath.jsonpath(匹配的字典,'jsonpath表达式')
     
    如:res2= jsonpath.jsonpath(d,'$..name')  #找d字典下面所有的name对应的值,返回一个列表
    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)
  • 相关阅读:
    Unity 自定义日志保存
    一万字详解 Redis Cluster Gossip 协议
    第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛非官方题解
    数组小游戏---火把萤石
    11个编程接单的网站,你有技术就有收入,有收入就有女朋友《男盆友》
    逆向工程,调试Hello World !程序(更新中)
    魔改一波合成大西瓜!代码已开源~
    如何使用C++做个简单推箱子游戏
    第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛非官方题解
    zookeeper应用
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/10580792.html
Copyright © 2011-2022 走看看