JSONPath 提取器,免费
粘贴 JSON 并输入 $.store.book[0].title 这样的路径表达式以提取值。
结果
工作原理
- 粘贴您的 JSON:在输入区输入一个 JSON 对象或数组。
- 输入 JSONPath 表达式:键入如 $.store.book[*].author 或 $.users[?(@.age > 18)] 的路径以选择您想要的数据。
- 查看提取结果:匹配到的值会立即出现在输出面板中。可复制或导出结果。
为什么使用 JSONPath 提取器?
当您处理复杂的 API 响应或深层嵌套的 JSON 时,手动提取特定值既慢又容易出错。JSONPath 是 JSON 的查询语言 · 类似于 XML 的 XPath。它让您通过简洁的路径表达式精确定位所需数据 · 无论是单个嵌套值、数组中的所有元素,还是按条件过滤的记录。此工具让 JSONPath 的探索变得交互式,无需编写代码。
功能特性
- 完整的 JSONPath 支持:支持点记法、方括号记法、通配符(*)、递归下降(..)、过滤(?())以及数组切片。
- 实时求值:在您输入 JSONPath 表达式的过程中实时更新结果。
- 格式化输出:提取的值以美化后的 JSON 形式显示。
- 多匹配:返回 JSON 文档中所有匹配的节点。
- 错误提示:当路径表达式无效或没有匹配时,给出清晰的错误信息。
常见问题
什么是 JSONPath?
JSONPath 是一种用于 JSON 文档的查询语言,类似于 XML 的 XPath。像 $.users[*].name 这样的路径会选择 users 数组中每个对象的 name 字段。它被广泛用于 API 测试、数据转换和 JSON 处理。
如何按条件过滤数组元素?
使用过滤表达式:$.items[?(@.price < 50)] 会返回价格低于 50 的所有项目。@ 符号指向当前正在求值的元素。
支持递归搜索吗?
支持。.. 运算符在各层级进行递归搜索。例如 $..name 会找到 JSON 结构中任何位置的所有 name 键,无论嵌套多深。
从博客文章到RFC 9535:JSONPath标准的17年之路
Stefan Gössner在2007年2月的单篇博客文章中提出了JSONPath,将XPath的思想适配到JSON。他发布了一个JavaScript参考实现,勾勒了语法($根、点和括号子操作符、..用于递归下降、*用于通配符、[start:end:step]用于数组切片、[?(...)]用于过滤表达式),整个生态系统随之展开。实现激增:JavaScript的jsonpath、Java的JsonPath、jq(Stephen Dolan,2012)与JSONPath相邻但是它自己的东西、Python的jsonpath-ng、JMESPath(AWS,2014)作为更严格的对手。问题是:每个实现都漂移了。过滤器语法、递归语义、正则匹配、根标识符,所有这些在不同的库中都有细微差异。Carsten Bormann等人2023年的比较研究测试了41个不同的JSONPath实现对相同输入,对同一表达式得到了41组不同的结果。IETF JSONPath工作组于2020年召集起来修复这个问题。RFC 9535《JSONPath: Query Expressions for JSON》于2024年2月发布,成为JSONPath的第一个正式标准,距Gössner原始帖子17年。RFC 9535编纂了语法,定义了规范化的输出格式,要求字符串比较的Unicode规范化,并添加了一致性测试套件。
JSONPath语法速查表
覆盖大多数实际查询的七个操作符:
$根。每个路径从这里开始。仅$返回整个文档。.name按名字的子节点。$.store.book选择store内的book字段。带有空格或特殊字符的名字需要括号表示法:$['book title']。[0]数组索引。$.book[0]第一个元素。$.book[-1]最后一个元素(RFC 9535新增)。[start:end:step]数组切片。Python风格:$.book[1:3]元素1和2,$.book[::2]每隔一个元素。step可以为负数以反转。*通配符。$.book[*].title每本书的标题。也可用作属性通配符:$.store.*store的所有直接子节点。..递归下降。$..title查找任何深度的每个title字段。强大但在大文档上慢。[?(...)]过滤表达式。$.book[?(@.price < 10)]价格低于10的所有书。@表示「当前元素」。RFC 9535将其命名为?并标准化了比较操作符== != < <= > >=加布尔&& ||。此查看器的快速模式不评估过滤表达式,如果需要它们,请使用jsonpath-plus这样的库。
你实际使用JSONPath的地方
- kubectl输出过滤。
kubectl get pods -o jsonpath='{.items[*].metadata.name}'随Kubernetes发布,是日常使用的JSONPath消费者。Kubernetes变体去掉了前导的$,有一些特点,如果你在该生态系统中生活,值得注意。 - 使用Postman或Insomnia的API测试。像
pm.expect(jsonData.items[0].status).to.eql('active')这样的测试断言通常在底层表达为JSONPath。 - Grafana / 可观察性仪表板。JSON数据源面板使用JSONPath查询指标;OpenTelemetry收集器使用类似JSONPath的语法来提取span属性。
- 快速CLI提取。将此工具与
curl | jq配对用于实时API探索:在查看器中原型化路径,然后转换为jq语法用于shell脚本。(jq使用点表示法,但不严格是JSONPath。) - ETL和数据工程。Airflow XCom映射、dbt seed文件和SQL JSON列提取都使用类似JSONPath的表达式来访问嵌套有效负载。
- 令牌检查。深入解码的JWT:
$.payload.iss用于发行者,$..roles[*]用于在声明树中任何地方授予的每个角色。 - Webhook处理程序设计。在编写处理程序代码之前,粘贴真实的webhook有效负载并原型化提取系统关心字段的路径。节省与上游服务的往返。
会咬人的错误
- 实现漂移。在一个库中工作的路径可能在另一个库中产生不同的结果或没有结果。在RFC 9535之前没有任何标准化。现在在库的文档中查找「RFC 9535一致」(IETF测试套件随RFC发布)。
- 过滤器引号。
$.book[?(@.title=="Foo")]在RFC 9535中要求过滤器内使用双引号;许多较旧的库也接受单引号'Foo'。混合它们是生产中「语法错误」的常见原因。 - 递归下降是贪婪的。
$..*返回文档中的每个值,包括嵌套的对象和数组本身,而不仅仅是叶子。在大文档上这可能需要几秒钟。先缩窄路径,然后下降。 - 整数与字符串键。JSON只有字符串键,即使它们看起来是数字。
$.users.123和$.users[123]在某些库中意思不同:前者查找字面命名为"123"的属性,后者可以解释为数组索引123。 - 负切片。
$.book[-1:]在RFC 9535和大多数实现中意为「最后一个元素」,但在2024年之前,一些库将负索引视为错误。如果你针对较旧的解析器,使用绝对索引。 - 忘记
$。没有前导$的路径在RFC 9535中无效。一些实现接受.store.book作为简写,其他实现拒绝。始终以$为前缀。 - 性能。在10 MB文档上的递归下降
..每次匹配可能是O(n)。对于数据仓库列或热循环,使用$..一次预提取,缓存结果,然后遍历缓存的数组。永远不要在每个请求上运行复杂的JSONPath。
JSONPath vs jq vs JMESPath vs JSON Pointer
- JSONPath(RFC 9535)。最适合临时查询和配置文件。语法从XPath熟悉,标准是新鲜的,多种语言库支持它。
- jq。一个完整的数据转换语言,不仅仅是路径查询。增加了map/filter/reduce、字符串函数、数学、格式化。当你需要重塑数据时,而不仅仅是提取它,这更好。有自己的点表示法语法,但在过滤器级别上与JSONPath不同。
- JMESPath。AWS CLI使用的2014年替代品(
aws ec2 describe-instances --query "...")。比JSONPath更严格、更功能性,从第一天就有真正的语法,支持投影和管道运算符。在亚马逊生态系统之外不太常见。 - JSON Pointer(RFC 6901)。2013年的标准,用于寻址单个值:
/store/book/0/title。不能进行通配符、过滤器或递归。被JSON Patch(RFC 6902)、JSON Schema$ref和Kubernetes patch API使用。当你需要精确寻址而不是查询时选择这个。
更多常见问题
JSONPath和XPath相同吗?
受其启发,但不相同。XPath由W3C于1999年为XML完成,JSONPath由Gössner于2007年勾画,将相同想法带入JSON。最大的差异:JSONPath使用.和[]而不是/,JSONPath没有XML命名空间或属性的概念,JSONPath标准化得晚得多(2024 vs 1999),所以多年来它是一种事实上的语法,有许多不兼容的实现。
为什么相同的JSONPath在不同工具中给出不同结果?
因为JSONPath直到RFC 9535(2024年2月)才标准化。在此之前,每个实现都自己决定过滤器语法、正则支持、根标识符、转义规则和边缘情况(空数组、缺失键、过滤器中的类型强制)。2023年IETF工作组研究测试了41个实现对相同输入,得到了41组不同的结果。RFC 9535修复了新和更新的库;旧库将分歧,直到它们迁移。始终检查你的库是否声明「RFC 9535一致」。
我可以用JSONPath修改JSON,还是只能读取?
RFC 9535严格定义JSONPath为查询语言:它从文档返回值,不会变更。要修改JSON,使用JSON Patch(RFC 6902),它使用JSON Pointer路径和add/remove/replace/copy/move/test操作。一些库结合两者(例如JavaScript中的jsonpath-plus有一个apply()变更扩展),但那不是标准JSONPath。
JSONPath支持过滤器中的正则表达式吗?
RFC 9535添加了两个正则函数:match(node, regex)匹配整个字符串,search(node, regex)匹配任何子字符串。示例:$.book[?(match(@.isbn, "^978-"))]。正则风味是I-Regexp(RFC 9485,XML Schema正则的配置文件),不是PCRE或JavaScript正则。较旧的库使用其宿主语言的正则风味,这使得正则查询特别不可移植。
当我使用此工具时,我的JSON会被发送到任何地方吗?
不。路径评估完全在浏览器的JavaScript引擎中运行。在DevTools中打开Network选项卡并运行查询,你将在评估期间看到零出站请求。对带有秘密的API响应、带有PII的数据库转储或包含凭据的配置文件安全。