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。