文章目录
- 介绍
- 安装
- 语法
- 语法规则
- 举例说明
- 在 python 中使用
- 获取所有结构
- 所有子节点的作者
- 获取所有子孙节点
- 获取所有价格
- 取出第三本书的所有信息
- 取出价格大于70块的所有书本
- 从mongodb 中取数据的示例
介绍
JSONPath能在复杂的JSON数据中 查找和提取所需的信息,它是一种功能强大的查询语言,可以通过简单的表达式来快速准确地定位和提取JSON数据。本文将介绍JSONPath的基本语法和用法,并为您展示如何封装和使用JSONPath方法来处理和操作JSON数据。
JSONPath类似于XPath提供了一种更简洁、灵活和高效的方式来查询、定位和提取JSON数据中的内容
安装
pip install jsonpath
语法
from jsonpath import jsonpath
res = jsonpath(dict,'jsonpath语法规则字符串')
语法规则
JsonPath | 描述 |
---|---|
$ | 根节点元素,最外层的大括号 |
@ | 当前节点元素 |
. 或 [] | 绝对路径,取子节点元素 |
… | 相对路径,内部的任意位置,选择符合条件的子孙节点元素 |
* | 匹配所有元素节点 |
[] | 迭代器提示(可以在里边做简单的迭代操作,如数组下标,根据内容筛选) |
[,] | 支持迭代器中做多选 |
?() | 支持过滤操作 |
() | 支持表达式计算 |
举例说明
获取书架上的书进行操作
- 数据结构:
book_dict = {
"store":{
"book":[
{
"name": "java 核心编程1",
"price": "65",
"isbn": "IS002598934",
"author" : "周立新"
},
{
"name": "java 核心编程2",
"price": "64",
"isbn": "IS876430456",
"author": "周立新"
},
{
"name" : "java 编程思想",
"price": "120",
"isbn": "IS256709873",
"author": "Bruce Eckel"
},
{
"name" : "RabbitMq 实战指南",
"price": "79",
"isbn": "IS987623450",
"author": "朱忠华"
},
{
"name" : "图解 TCP/IP",
"price": "69",
"isbn": "IS9787354679",
"author": "竹下隆史"
}
]
}
}
- 结构解析例子
JsonPath | 结果 |
---|---|
$.store.book[*].author | store 中的所有的 book的作者 |
$…store.* | 所有的书籍 |
$.store…price | store 中的所有的内容的价格 |
$…book[2] | 第三本书 |
$…book[(@.length-1)] 或 $…book[-1:] | 最后一本书 |
$…book[0,1] 或 $…book[:2] | 前两本书 |
$…book[?(@.isbn)] | 获取有 isbn 的所有数 |
$…book[?(@.price<100)] | 获取价格<100的所有的书 |
$…* | 获取所有的数据 |
在 python 中使用
如下代码都用单元测试来举例,具体代码链接:去这里
- 设置测试结构
def setUp(self):
"""
前置设置
@return:
"""
self.book_dict = {
"store": {
"book": [
{
"name": "java 核心编程1",
"price": 65,
"isbn": "IS002598934",
"author": "周立新"
},
{
"name": "java 核心编程2",
"price": 64,
"isbn": "IS876430456",
"author": "周立新"
},
{
"name": "java 编程思想",
"price": 120,
"isbn": "IS256709873",
"author": "Bruce Eckel"
},
{
"name": "RabbitMq 实战指南",
"price": 79,
"isbn": "IS987623450",
"author": "朱忠华"
},
{
"name": "图解 TCP/IP",
"price": 69,
"isbn": "IS9787354679",
"author": "竹下隆史"
}
]
}
}
pass
获取所有结构
def test_all(self):
"""
获取所有的结构
@return:
"""
dict_data = jsonpath(self.book_dict, '$..*')
print("查看dict_data支持的属性和方法:", dir(dict_data))
try:
for item in dict_data[0]['book']:
# 美化打印
pprint(item)
except Exception as e:
print(e)
pass
所有子节点的作者
def test_sub_author(self):
"""
获取所有子节点的作者
@return:
"""
all_author = jsonpath(self.book_dict, '$.store.book[*].author')
print(all_author)
pass
获取所有子孙节点
def test_sub_all(self):
"""
获取所有子孙节点
@return:
"""
sub_all = jsonpath(self.book_dict, '$..store.*')
print(sub_all)
pass
获取所有价格
def test_price_all(self):
"""
获取子节点的所有价格
@return:
"""
price_all = jsonpath(self.book_dict, '$..price')
print("所有的价格:", price_all)
price_sum = sum([int(price) for price in price_all])
print(f"价格之和:{price_sum}")
pass
取出第三本书的所有信息
def test_book_item(self):
"""
取出第三本书的所有信息
@return:
"""
book_item = jsonpath(self.book_dict, '$..book[2]')
print(book_item)
pass
取出价格大于70块的所有书本
def test_book_filter(self):
book_count = jsonpath(self.book_dict, '$..book[?(@.price>70)]')
print(book_count)
从mongodb 中取数据的示例
遇到复杂的结构可以使用 pprint()来美化打印
def test_mongo_data(self):
"""
获取mongo中的复杂结构的数据
@return:
"""
dict_data = MongoPool().project_8.coffer_check_data.find_one({"_id": "629dbfe615e74466831b5ce2"})
# 美化打印
pprint(dict_data)
change_list = jsonpath(dict_data, '$..change')
print("获取某一个字字段的列表:", change_list)
pass
效果: