JsonPath需要在Python中安装jsonpath-ng库,路径写作要注意点号和方括号的用法,数组索引不能省略,特殊键名[''key']、推荐使用..递归操作符应直接用于大数据,但应谨慎使用responsee.json()而非手动loads,并妥善处理异常和空结果。JsonPath在Python中没有本地支持,必须安装第三方库
Python标准库没有jsonpath,必须用jsonpath-ng(推荐)或jsonpath-rw。前者保持活跃,支持Python 3.7+,后者已经停止,存在兼容性问题。不要试试。jsonpath(小写包名),这是另一个不兼容的旧实现,容易返回空结果也不清楚。
安装命令:
pip install jsonpath-ng
- 若项目使用
pipenv或poetry,记住同步进依赖列表,否则CI环境将失败 - 如果Windows下提示编译错误,请先升级
setuptools和wheel再重试 - 避免同时安装多个JsonPath库,其语法分析器冲突,
import可能会默默地覆盖
JsonPath路径对.和['key']特别是嵌套数组+对象混合结构。例如,API返回:
{"data": {"items": [{"id": 1, "meta": {"status": "ok"}}]}},想取status,正确的写法是:$.data.items[0].meta.status,不是$.data.items[0].meta["status"](引号在jsonpath-ng非法)。
-
[0]不能省略-即使只有一个,jsonpath-ng数组不自动展开,$.data.items.meta.status会返回空 - 如果键名包含空格或特殊字符(如)
"user name")必须用['user name'],但请注意,单引号是字符串的一部分,而不是语法符号 - 用
find()后检查result是否为空列表,不要直接result[0].value,否则IndexError
当API结构不确定时(例如日志)trace可以在任何级别使用字段),..比硬写路径更可靠。例如:$..trace_id所有的名字都可以匹配trace_id无论嵌套有多深,字段。
Find JSON Path Online
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
下载立即学习“Python免费学习笔记(深入);
-
..性能差,大数据响应谨慎;实测10MB 在JSON中执行一次..查询比固定路径慢3–5倍 - 当匹配多个结果时,
find()返回列表时,您需要判断是否选择第一个或遍历-如果没有业务逻辑,则很容易获得错误的上下文数据 - 无法用
..跳过中间必选级别,比如$..items..status不会匹配{"items": {"status": "ok"}},因为items对象不是数组,必须写成$.items.status或$..items?.status(?表示可选,但需要jsonpath-ng1.6.0+
常见错误:把response.text用json.loads()转为Python dict,再喂JsonPath-这一步是多余而危险的。Unicode转义或特殊编码可能包含在JSON字符串中,loads()也许失败了,而且jsonpath-ng解码已在内部处理。
- 正确的做法是:
jsonpath_expr.find(response.json()),response.json()requests确保解码正确 - 如果API返回非JSON(如HTTPP) 500带HTML错误页),
response.json()抛JSONDecodeError,必须try/except不能指望JsonPath处理捕获 - 当响应体很大时,不要使用
response.json()将全部加载到内存中,改为流式分析(但JsonPath不支持流,此时必须更换ijson库配合手动导航)
response.json()使用前几层结构jsonpath-ng的parse()加find()循序渐进的验证比盲目改变路径要快得多。