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 的结果也未定义.