jsonpath-ng是python中推荐的jsonpath实现,需用pip install jsonpath-ng安装;旧版jsonpath包已停更、不兼容新python且语法错误频发。

Jsonpath 在 Python 中不是内置工具,必须用 jsonpath-ng(推荐)或旧版 jsonpath-rw;直接 pip install jsonpath 会装错包,提取失败是常态。
为什么 jsonpath pip 包不能用
PyPI 上名为 jsonpath 的包早已停止维护,不支持 Python 3.8+,且语法兼容性差,parse('$.store.book[*].title') 会直接抛 AttributeError: 'str' object has no attribute 'find'。实际应安装 jsonpath-ng(“ng”代表 next generation),它修复了 AST 解析、支持过滤器和函数,且文档清晰。
正确安装命令:
pip install jsonpath-ng
验证是否生效:
from jsonpath_ng import parse<br>from jsonpath_ng.ext import parse as ext_parse
注意:ext_parse 启用扩展语法(如 ?(@.price ),普通 <code>parse 不支持过滤器。
提取嵌套数组中满足条件的对象
典型场景:从 {"data": [{"id": 1, "status": "active"}, {"id": 2, "status": "inactive"}]} 中只取 status == "active" 的项。用基础 parse 无法过滤,必须用 ext_parse。
- 错误写法(无过滤,返回全部):
parse('$.data[*]') - 正确写法(带条件):
ext_parse('$.data[?(@.status == "active")]') - 注意字符串值必须用双引号包裹,单引号会报
JsonPathLexerError - 若字段值含空格或特殊字符,要用反引号:
$.data[?(@.`full name` == "Alice")]
find() 返回的是对象不是原始值
jsonpath-ng 的 find() 总是返回 Match 对象列表,每个含 .value(提取结果)和 .full_path(匹配路径)。直接 print 会看到一堆封装信息,不是你想要的字典或字符串。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
常见误操作:
result = jsonpath_expr.find(data)<br>print(result) # 输出 [Match(value='The Lord of the Rings', ...)]
正确取值方式:
- 取所有匹配值:
[match.value for match in jsonpath_expr.find(data)] - 只取第一个(确保有结果):
jsonpath_expr.find(data)[0].value if jsonpath_expr.find(data) else None - 避免重复执行
find():先存结果再处理,因为解析开销不小
性能敏感时别在循环里反复 parse()
parse() 是编译过程,内部构建语法树,耗时相对高。如果同一表达式要在多个 JSON 文档中复用(比如日志批量解析),必须把 parse('$.user.profile.name') 提到循环外。
错误示范:
for doc in docs:<br> jsonpath_expr = parse('$.user.profile.name') # 每次都重编译<br> result = jsonpath_expr.find(doc)
正确做法:
jsonpath_expr = parse('$.user.profile.name') # 一次编译,多次使用<br>for doc in docs:<br> result = jsonpath_expr.find(doc)
实测 1000 次解析,编译外提可减少约 60% 总耗时;若表达式含正则或复杂过滤,收益更明显。
深层嵌套本身不拖慢 Jsonpath,但过度使用递归通配符(如 $..name)可能遍历整棵树,遇到超大 JSON(>10MB)时响应明显变慢,此时应优先考虑用 json.loads() 后手动导航,或换用 ijson 流式解析。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










