🏠 首页 攻略 JSON Path 查询:从入门到精通

JSON Path 查询:从入门到精通

掌握 JSON Path 查询语法,轻松提取嵌套 JSON 数据中的目标字段。本文用实战案例讲解过滤、通配符、切片等高级用法,附在线工具推荐。

你是不是也遇到过这种场景?

拿到一个 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 区分大小写。Namename 是两个不同的字段。

坑二:空值处理

如果查询路径不存在,不同实现返回的结果不一样。有的返回空数组,有的返回 null。写代码时记得做空值判断。

坑三:特殊字符字段名

字段名包含空格或特殊符号时,需要用引号包裹:

$['my-field'].sub_field

总结

JSON Path 学起来不难。记住 $ 开头、* 通配、?() 过滤这三个核心概念,就能解决大部分查询需求。

遇到复杂场景再逐步学习递归搜索和排序功能。

你的项目里有没有经常需要解析的 JSON 数据?用 JSON Path 试试,可能一行就搞定了。