使用 JSONPath 表达式查询和提取 JSON 数据
工具功能
- 高级查询语法: 支持完整的 JSONPath 语法,包括通配符 (*)、递归下降 (..)、数组切片 ([start:end])、过滤器 ([?(@.price < 10)])和多路径选择器
- 路径表达式模板: 预构建的常用查询模板:根访问 ($)、直接子节点 ($.key)、数组项 ($.arr[*])、过滤项 ($.arr[?(@.id)])、递归搜索 ($..key)
- 实时预览: 即时执行查询,带语法高亮的 JSON 输入和输出,显示匹配路径、结果计数,并在源 JSON 中高亮匹配节点
- 结果导出: 将查询结果导出为 JSON(数组或单个值)、表格数据的 CSV 或格式化文本,一键复制和下载选项
使用方法
- 输入 JSON 数据: 粘贴或上传要查询的 JSON 数据
- 编写 JSONPath: 输入 JSONPath 表达式或使用常见模式模板
- 执行查询: 运行查询以查看带语法高亮的匹配结果
- 导出结果: 以您喜欢的格式复制或下载提取的数据
生成原理
JSONPath 语法
JSONPath 表达式以 $(根对象)开头,使用点符号 ($.property) 或括号符号 ($['property']) 进行访问。子节点使用 . 分隔符 ($.store.book),数组使用 [index] 或 [*] 表示所有项。数组切片 [start:end:step] 提取范围,如 [0:3](前 3 项)或 [-1](最后一项)。递归下降操作符 .. 搜索所有级别:$..author 查找所有 author 属性,无论嵌套深度如何。联合操作符 [,] 选择多个项:$[0,2,5] 获取特定数组索引。
过滤器表达式
过滤器使用 [?(@.condition)] 语法选择匹配条件的项。@ 表示迭代中的当前节点。比较操作符:==、!=、<、<=、>、>=。逻辑操作符:&& (and)、|| (or)、! (not)。示例:[?(@.price < 10)] 选择价格低于 10 的项;[?(@.category == 'fiction' && @.price < 20)] 组合条件。正则表达式匹配:[?(@.name =~ /pattern/)] 按正则过滤。过滤器可以使用 $ 引用根以进行跨层次比较:[?(@.price < $.maxPrice)]。
实现变体
JSONPath 有多个实现,语法略有不同:Goessner 的原始版本(JavaScript)、Jayway(Java)、jsonpath-ng(Python)。差异包括过滤器操作符(有些使用 @ vs $)、正则支持、脚本表达式和函数扩展。一些实现添加了函数,如 @.length、@.min()、@.max() 用于聚合。脚本表达式 [(@.price * @.quantity)] 启用计算。父操作符 ^ 和当前路径 ~ 提供上下文。始终检查目标实现的文档以了解支持的功能和语法特性。
常见问题
- 为什么 JSONPath 没有匹配到结果?
- 请确认路径以 $ 开头、数组索引有效、字段名拼写正确。可先用更简单的路径逐步验证。
- 如何在任意层级查找某个键?
- 使用递归下降:$..author 会在所有层级查找 author。
- 过滤器表达式怎么写?
- 使用 [?(@.price < 10)],@ 代表当前项;可用 &&、|| 组合条件,如 [?(@.category=='book' && @.price<20)]。
- 空结果与 null 有何区别?
- 空结果表示没有匹配;null 表示匹配项的值为 null。请检查源数据与路径表达式。
- 大 JSON 查询很慢怎么办?
- 避免过度使用 ..;先收窄搜索范围再做过滤。必要时分段处理或在后端预处理。
相关文档
- JSONPath 规范 - Goessner - 原始 JSONPath 提案和语法定义
- JSONPath 在线求值器 - 带表达式文档的交互式 JSONPath 测试器
- RFC 9535 - JSONPath 标准 - IETF 对 JSONPath 查询语言的标准化工作
- jsonpath-ng 文档 - 具有扩展功能的 Python JSONPath 实现
- Jayway JSONPath (Java) - 流行的带过滤器表达式的 Java 实现