4. 求值
4. 求值
JSON Pointer 的求值从对 JSON 文档根值的引用开始, 并以对该文档中某个值的引用结束. JSON Pointer 中的每个引用标记都会按顺序求值.
每个引用标记的求值从解码所有转义字符序列开始. 具体做法是先将出现的序列 ~1 转换为 /, 然后将出现的序列 ~0 转换为 ~. 按此顺序执行替换, 实现可以避免把 ~01 先变成 ~1 再变成 / 的错误; 这将是不正确的 (~01 在转换后应正确变为 ~1).
然后, 引用标记按以下方案修改所引用的值:
-
如果当前引用的值是 JSON 对象, 新引用的值就是对象中名称由该引用标记标识的成员. 如果成员名与标记具有相同数量的 Unicode 字符, 且其码点逐字节相等, 则认为成员名等于该标记. 不执行 Unicode 字符规范化. 如果被引用的成员名在对象中不唯一, 则被引用的成员未定义, 求值失败 (见下文).
-
如果当前引用的值是 JSON 数组, 引用标记必须 (MUST) 包含以下二者之一:
- 由数字组成的字符 (见下方 ABNF; 注意不允许前导零), 表示一个无符号十进制整数值, 使新引用的值成为由该标记标识的从零开始索引处的数组元素; 或者
- 恰好一个字符
-, 使新引用的值成为最后一个数组元素之后的 (不存在的) 成员.
数组索引的 ABNF 语法为:
array-index = %x30 / ( %x31-39 *(%x30-39) )
; "0", or digits without a leading "0"
实现会针对文档内容对每个引用标记求值; 如果无法为 JSON Pointer 的任一引用标记解析出具体值, 就会引发错误条件. 例如, 如果用非数字标记引用数组, 将引发错误条件. 详细信息见第 7 节.
注意, 使用字符 - 为数组建立索引始终会导致这种错误条件, 因为按照定义, 它引用的是不存在的数组元素. 因此, 如果 JSON Pointer 的应用希望该字符有用, 就需要规定应如何处理该字符.
对于 JSON Pointer 应用未定义具体处理动作的任何错误条件, 都会导致求值终止.