你是不是也遇到过这种场景?
拿到一个 API 返回的 JSON 数据,里面嵌套了七八层对象和数组。你只想取某个字段,却得写十几行循环遍历代码。
别急,JSON Path 就是来解决这个问题的。
什么是 JSON Path?
JSON Path 是一种查询语言,专门用来从 JSON 文档中提取数据。它的灵感来自 XPath(XML 的查询语言),语法简洁直观。
简单说,一行表达式就能替代几十行代码。
基础语法:从根节点开始
JSON Path 以 $ 开头,表示 JSON 数据的根节点。
假设你有这样一个 JSON:
{
"users": [
{"name": "张三", "age": 28, "city": "北京"},
{"name": "李四", "age": 35, "city": "上海"},
{"name": "王五", "age": 22, "city": "北京"}
]
}
提取所有用户名字:
$.users[*].name
结果:["张三", "李四", "王五"]
* 是通配符,表示匹配所有元素。
常用查询模式
按索引取值
取第一个用户:
$.users[0].name
结果:"张三"
取最后一个用户:
$.users[-1].name
结果:"王五"
负数索引从末尾开始计数,和 Python 一样。
条件过滤
只取北京的用户:
$.users[?(@.city == '北京')].name
结果:["张三", "王五"]
@ 代表当前遍历的元素,?() 是过滤表达式。
支持多种比较运算符:==、!=、<、>、<=、>=。
多字段同时提取
一次性拿名字和城市:
$.users[*].name,$.users[*].city
结果:["张三", "李四", "王五", "北京", "上海", "北京"]
注意这种写法会平铺所有结果。如果需要成对数据,建议用脚本处理。
进阶技巧
递归搜索(..)
不管嵌套多深,都能找到目标字段:
$..city
结果:["北京", "上海", "北京"]
这个 .. 操作符会遍历整个 JSON 树,找到所有包含 city 键的值。
切片操作
取前两个用户:
$.users[:2]
取第三个及之后的用户:
$.users[2:]
切片语法和 Python 完全一致。
长度查询
统计用户数量:
$.users | length
结果:3
排序
按年龄降序排列:
$.users | sort_by(@.age) | reverse
先按 age 排序,再反转得到降序。
实际应用场景
场景一:API 响应数据清洗
后端返回了完整的用户对象,但前端只需要部分字段。用 JSON Path 快速提取,减少数据传输量。
场景二:配置文件解析
很多配置文件用 JSON 格式。需要批量修改某些配置项时,JSON Path 比手写解析器快得多。
场景三:数据报表生成
从数据库导出的 JSON 数据中,提取特定维度的指标做汇总分析。
推荐工具:navbox 的 JSON Path 查询器
手动写表达式容易出错。试试 navbox 上的 JSON Path 查询工具。
它支持实时预览结果,有语法高亮和错误提示。粘贴你的 JSON 数据,输入查询表达式,立刻看到匹配结果。
不用安装任何软件,浏览器打开就能用。
常见坑点
坑一:大小写敏感
JSON Path 区分大小写。Name 和 name 是两个不同的字段。
坑二:空值处理
如果查询路径不存在,不同实现返回的结果不一样。有的返回空数组,有的返回 null。写代码时记得做空值判断。
坑三:特殊字符字段名
字段名包含空格或特殊符号时,需要用引号包裹:
$['my-field'].sub_field
总结
JSON Path 学起来不难。记住 $ 开头、* 通配、?() 过滤这三个核心概念,就能解决大部分查询需求。
遇到复杂场景再逐步学习递归搜索和排序功能。
你的项目里有没有经常需要解析的 JSON 数据?用 JSON Path 试试,可能一行就搞定了。