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)

 

转载于:https://www.cnblogs.com/angle6-liu/p/10580792.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值