跳转到主要内容
CuteJSON
↑↓ 导航 Enter 选择 Esc 关闭

如何使用JSON Pointer,以及失败时怎么办

发布 1 分钟阅读 作者 Akash Kinkar Pandey

JSON Pointer,RFC 6901,是一个小规范:四页,一种语法,对路径意味着什么没有歧义。它出现在需要引用JSON文档中确切位置而不发明自己的路径语言的地方,最常见于JSON Schema和JSON Schema的$ref关键字中。

语法简介

指针是用/分隔的令牌序列。/user/name表示user对象内的name键。/items/0表示items数组的第一个元素。空字符串,没有任何令牌的指针,表示整个文档。令牌内需要转义两个字符:~1代表字面量/,~0代表字面量~,总是按此顺序读取,所以~01表示~1而不是/。

使用JSON Pointer求值器

粘贴文档,键入指针,然后按解析。给定

{"a/b":{"c~d":42},"list":["x","y"]}

指针/a~1b/c~0d通过一个字面包含斜杠的键和一个字面包含波浪号的键解析,返回42。这就是转义存在的全部原因:没有它们,包含分隔符字符的键将无法寻址。

失败的查找告诉你什么

大多数工具将失败的指针报告为简单的“未找到”,这不足以在有多个键的文档中修复它。这个告诉你指针走了多远,在那里找到了什么,以及对象实际拥有哪些键。对同一文档请求/a~1b/nope返回:

对象中没有“nope”键,它有c~d。解析到/a?1b

这足以立即看到拼写错误,而不是重新阅读整个文档来猜测哪里出了问题。

破折号,以及为什么它不解析

在JSON Patch中,指向数组的指针的最后一个令牌作为破折号表示“最后一个元素之后的位置”,用于追加。单独对文档解析/items/-不会命名现有值,因为那里还没有可以指向的内容。求值器解释这个区别而不是将其视为一般的解析失败。

与JSONPath的不同之处

JSON Pointer命名一个位置并解析为恰好一个值或失败。JSONPath是一种查询语言,可以一次匹配多个值,使用通配符、过滤器和切片。当你已经确切知道想要哪个值时使用指针;当你搜索匹配条件的值时使用JSONPath。

返回所有文章