无需登录 数据私有 本地保存

JSON 查询演练场 - JMESPath/JSONPath 即时评测

35
0
0
0
JSON查询演练场 |
JSON 输入 ✓ 有效
1
查询表达式
提示:使用 * 遍历数组,[?condition] 过滤,| 管道操作
快捷尝试:
等待输入...
查询结果 就绪
在左侧输入 JSON 数据并在查询面板输入表达式,结果将显示在这里。

常见问题与知识点

JMESPath 是一种用于查询和转换 JSON 数据的声明式语言。它由 AWS 开发,广泛应用于 AWS CLI、Ansible、Azure CLI 等工具中。JMESPath 支持管道表达式、多级过滤、函数调用(如 length()sort_by()max_by())等高级特性,语法简洁强大,无需以 $ 开头。

JSONPath 是一种受 XPath 启发的 JSON 查询语言,使用 $ 表示根节点。它支持点表示法和方括号表示法,递归搜索($..key),以及条件过滤([?(@.field)])。JSONPath 在 REST API 测试、数据提取场景中非常流行,有 JavaScript、Python、Java 等多种实现。

语法差异:JSONPath 必须以 $ 开头,JMESPath 不需要。
功能差异:JMESPath 支持管道操作 |、内置函数(如 sort_by()group_by())、多级哈希投影等高级特性;JSONPath 相对简单,主要专注于路径定位和基本过滤。
返回值:JSONPath 始终返回数组(可能为空),JMESPath 可返回任意类型(对象、数组、原始值或 null)。
生态:JMESPath 在 AWS/DevOps 领域广泛使用;JSONPath 在 API 测试和前端数据处理中更常见。

$ 在 JSONPath 中代表 JSON 数据的根节点(类似于文件系统中的 /)。所有 JSONPath 表达式都以 $ 开头,然后逐级定位到目标数据。例如 $.store.book[0].title 表示从根开始,进入 store 对象,获取 book 数组中第一个元素的 title。

JSONPath:使用 [?(@.字段 运算符 值)],例如 $.items[?(@.price < 20)]@ 代表当前数组元素。
JMESPath:使用 [?字段 运算符 值],例如 items[?price < '20']。注意 JMESPath 中字符串比较需要用反引号包裹字面量值,如 [?name == 'target']

管道操作 | 允许将前一个表达式的结果作为后一个表达式的输入,实现链式处理。例如 items[*].price | sort(@) | [0] 先获取所有价格,然后排序,最后取最小值。这是 JMESPath 相比 JSONPath 的一个显著优势,使得复杂数据转换变得简洁。

在 JMESPath 中,查询无匹配时通常返回 null;而在 JSONPath 中,无匹配返回空数组 []。这是两者的重要差异之一。在实际开发中,需要注意这个差异——对 JMESPath 结果做 .length 检查前需先判断是否为 null;而 JSONPath 结果可以安全地检查长度。

JSONPath:jsonpath-plus(JS/Node,本工具使用)、jsonpath(Python)、JsonPath(Java/Gatling)、jsonpath-rw(Python)。
JMESPath:jmespath.js(JS/Node,本工具使用)、jmespath(Python,AWS CLI 内置)、jmespath-java(Java)。选择库时建议优先使用官方或社区活跃维护的版本。