Skip to main content

4. Evaluation (求值)

4. Evaluation (求值)

JSON Pointer 的求值从对 JSON 文档根值 (root value) 的引用开始, 并以对文档内某个值的引用结束。JSON Pointer 中的每个引用标记 (reference token) 按顺序进行求值。

每个引用标记的求值从解码任何转义字符序列 (escaped character sequence) 开始。这通过首先将序列 '~1' 的任何出现转换为 '/', 然后将序列 '0' 的任何出现转换为 '' 来执行。通过按此顺序执行替换, 实现可以避免将 '~01' 首先转换为 '~1', 然后再转换为 '/' 的错误, 这是不正确的 (字符串 '~01' 在转换后应正确地变为 '~1')。

然后, 引用标记根据以下方案修改所引用的值:

  • 如果当前引用的值是 JSON 对象 (object), 则新的引用值是由引用标记标识的名称的对象成员 (object member)。成员名称 (member name) 与标记相等, 当且仅当它具有与标记相同数量的 Unicode 字符, 并且它们的代码点 (code points) 逐字节相等。不执行 Unicode 字符规范化 (character normalization)。如果对象中引用的成员名称不唯一, 则所引用的成员未定义, 求值失败 (见下文)。

  • 如果当前引用的值是 JSON 数组 (array), 则引用标记必须 (MUST) 包含以下之一:

    • 由数字 (digits) 组成的字符 (参见下面的 ABNF; 注意不允许前导零), 表示无符号十进制整数值, 使新的引用值成为由标记标识的零基索引 (zero-based index) 的数组元素, 或
    • 恰好是单个字符 "-", 使新的引用值成为最后一个数组元素之后的 (不存在的) 成员。

数组索引的 ABNF 语法为:

array-index = %x30 / ( %x31-39 *(%x30-39) )
; "0", or digits without a leading "0"

实现将针对文档内容求值每个引用标记, 并且如果无法为 JSON Pointer 的任何引用标记解析出具体值 (concrete value), 则将引发错误情况 (error condition)。例如, 如果使用非数字标记引用数组, 则将引发错误情况。详见 Section 7。

请注意, 使用 "-" 字符索引数组将始终导致此类错误情况, 因为根据定义, 它引用的是不存在的数组元素。因此, JSON Pointer 的应用需要指定如何处理该字符, 如果要使其有用的话。

对于 JSON Pointer 应用未定义特定操作的任何错误情况, 都会导致求值终止。