Python中JsonPath的使用

本文介绍了JsonPath在Python中的应用,用于方便地从复杂的JSON数据中提取所需内容。JsonPath类似于XPath,提供强大的JSON解析功能,支持如选取根节点、过滤操作等功能。通过示例展示了如何获取所有书籍作者和包含isbn的书信息,并提供了Python中安装和使用JsonPath模块的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JsonPath

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

Json示例数据:

{
    "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
        }
    }
}

如果有一个多层嵌套的复杂JSON,想要根据 key-value 或 下标 的方式去批量提取JSON数据里的内容,是比较麻烦的。JsonPath 模块就能解决这个问题

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

JsonPath语法规则

官方文档:https://goessner.net/articles/JsonPath/

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

JsonPath 对于 JSON 来说,相当于 XPath 对于 XML

JsonPath与XPath语法对比:

XpathJsonPath描述
/$根节点
.@现行节点
/. 或 []取子节点
取父节点,Jsonpath未支持
@根据属性访问,Jsonpath未支持,因为Json是个Key-value递归结构,不支持属性访问
**匹配所有元素节点
[][]迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)
|[,]支持迭代器中做多选。连接操作符在XPath 结果合并其它结点集合。Jsonpath允许name或者数组索引。
[]?()支持过滤操作
[start: end: step]数组分割操作从ES4借鉴。
()脚本表达式,使用底层脚本引擎。支持表达式计算
()Xpath分组;JsonPath不支持

使用对比

XPathJsonPath描述
/store/book/author$.store.book[*].author获取店内所有书籍的作者
//author$…author获取所有作者
/store/*$.store.*获取store的所有元素。所有的book和bicycle
/store//price$.store…price获取store里面所有东西的价格
//book[3]$…book[2]获取第三本书的所有信息
//book[last()]$..book[(@.length-1)]$..book[-1:]获取最后一本书的所有信息
//book[position()<3] $..book[0,1] $..book[:2]获取前面两本书的所有信息
//book[isbn]$…book[?(@.isbn)]过滤出所有的包含isbn的书信息
//book[price<10]$…book[?(@.price<10)]过滤出价格低于10的书
//*$…*获取所有元素

Xpath索引下标是从1开始的
JsonPath 索引下标是从0开始

Python中JsonPath模块的运用

安装

pip install jsonpath

以Json数据模拟接口返回情况,通过jsonpath模块获取需要的数据

from jsonpath import jsonpath

res = {
    "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
        }
    }
}

# 过滤出所有的包含isbn的书信息
data_book = jsonpath(res,'$..book[?(@.isbn)]')
print(data_book)

# 获取店内所有书籍的作者
data_author = jsonpath(res,'$.store.book[*].author')
print(data_author)

结果:

[{'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}]

['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']
### Python使用 `jsonpath` 的教程 #### 安装依赖库 为了在 Python使用 JSONPath,可以安装第三方库 `jsonpath-ng` 或者 `jsonpath-rw`。以下是两种方式的安装方法: 通过 pip 安装: ```bash pip install jsonpath_ng # 或者 pip install jsonpath_rw ``` --- #### 基本概念 JSONPath 是一种用于提取嵌套 JSON 数据中的特定字段的语言工具。它类似于 XPath 对 XML 的作用。 - **根节点 (`$`)**:表示整个 JSON 文档。 - **当前节点 (`@`)**:指代正在被处理的对象本身。 - **子节点选择符 (`.`, `[]`)**:用于访问对象键或者数组索引。 - **递归下降 (`..`)**:查找任意层次下的匹配项[^4]。 --- #### 使用 `jsonpath-rw` 库解析 JSON 数据 以下是一个完整的例子展示如何加载 JSON 文件并执行查询操作: ##### 示例代码 假设有一个名为 `data.json` 的文件,其内容如下: ```json { "store": { "book": [ {"category": "fiction", "title": "Book A", "price": 9.99}, {"category": "non-fiction", "title": "Book B", "price": 12.99} ], "bicycle": {"color": "red", "price": 19.95} } } ``` 可以通过以下代码来解析该 JSON 并提取所需的数据: ```python from jsonpath_rw import parse import json # 加载 JSON 数据 with open('data.json', 'r', encoding='utf-8') as file: data = json.load(file) # 创建一个 JSONPath 表达式 expr = parse('$..book[?(@.price<10)]') # 执行查询 matches = expr.find(data) # 输出结果 for match in matches: print(match.value) ``` 这段代码的作用是从 JSON 数据中筛选价格低于 10 的书籍,并打印它们的内容[^3]。 --- #### 支持的操作与语法 | 功能 | JSONPath 表达式 | 描述 | |-------------------------|-------------------------------|----------------------------------------------------------------------| | 获取根节点 | `$` | 返回整个 JSON 数据结构 | | 当前节点 | `@` | 指向当前上下文中正在评估的对象 | | 子节点 | `.field_name` 或 `[index]` | 访问对象的某个字段或数组的一个元素 | | 递归遍历 | `..field_name` | 查找任何层级上的指定字段 | | 过滤 | `[?(expression)]` | 根据条件过滤数据 | 例如: - 提取所有书的价格列表:`$.store.book[*].price`[^2] - 查询最后一个书的信息:`$..book[(@.length-1)]` --- #### 处理复杂场景的例子 如果需要更复杂的逻辑,比如组合多个条件或进行算术运算,则可以利用高级功能完成这些需求。 **示例:** 找到所有属于 “fiction” 类别的书籍及其价格大于等于 10 的记录。 ```python expr = parse("$..book[?(@.category=='fiction' && @.price>=10)]") matches = expr.find(data) print([match.value for match in matches]) ``` 此脚本会返回满足上述两个约束条件的结果集合[^4]。 --- #### 总结 以上介绍了如何借助于 `jsonpath-rw` 实现对 JSON 数据灵活高效的检索能力。无论是简单还是复杂的路径模式都能轻松应对,极大地简化了程序开发过程中的数据处理工作量。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值