Skip to main content

2. Processing Merge Patch Documents (处理合并补丁文档)

2. Processing Merge Patch Documents (处理合并补丁文档)

JSON 合并补丁文档通过示例描述要对目标资源进行的一组更改。合并补丁文档的接收者负责将合并补丁与目标资源的当前内容进行比较, 以确定要应用于目标的特定更改操作集。

要将合并补丁文档应用于目标资源, 系统实现以下函数的效果, 以伪代码描述。在此描述中, 该函数称为 MergePatch, 它接受两个参数: 目标资源文档和合并补丁文档。Target 参数可以是任何 JSON 值或 undefined。Patch 参数可以是任何 JSON 值。

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

关于该函数有几点需要注意。如果补丁不是对象, 结果将始终是用整个补丁替换整个目标。此外, 无法修补不是对象的目标的一部分, 例如只替换数组中的某些值。

MergePatch 操作被定义为在数据项级别操作, 而不是在文本表示级别操作。不期望 MergePatch 操作会保留文本表示级别的特性, 例如空白, 成员排序, 超出目标实现中可用精度的数字精度等。此外, 即使目标实现允许具有相同名称的多个名称/值对, MergePatch 操作在此类对象上的结果也是未定义的。