跳到主要内容

2. 处理 Merge Patch Documents (Processing Merge Patch Documents)

2. 处理 Merge Patch Documents (Processing Merge Patch Documents)

JSON merge patch documents 通过示例描述要对 target resource 进行的一组更改. merge patch documents 的接收方负责将 merge patch 与 target resource 的当前内容进行比较, 以确定要应用到 target 的具体 change operations 集合.

为了将 merge patch document 应用于 target resource, 系统实现以下以 pseudocode 描述的函数效果. 在本描述中, 该函数称为 MergePatch, 并接受两个 arguments: target resource document 和 merge patch document. Target argument 可以是任何 JSON value 或 undefined. Patch argument 可以是任何 JSON value.

define MergePatch(Target, Patch):
if Patch is an Object:
if Target is not an Object:
Target = {} # Ignore the contents and set it to an empty Object
for each Name/Value pair in Patch:
if Value is null:
if Name exists in Target:
remove the Name/Value pair from Target
else:
Target[Name] = MergePatch(Target[Name], Value)
return Target
else:
return Patch

关于该函数有几点需要注意. 如果 patch 不是 object, 结果总是用整个 patch 替换整个 target. 此外, 无法 patch 非 object target 的一部分, 例如只替换 array 中的某些 values.

MergePatch operation 被定义为在 data items 层级运行, 而不是在 textual representation 层级运行. 不期望 MergePatch operation 保留 textual-representation 层级的特性, 例如 white space, member ordering, 超出 target implementation 可用能力的 number precision, 等等. 此外, 即使 target implementation 允许多个具有相同 name 的 name/value pairs, MergePatch operation 对这类 objects 的结果也未定义.