2. Processing Merge Patch Documents (マージパッチドキュメントの処理)
2. Processing Merge Patch Documents (マージパッチドキュメントの処理)
JSON マージパッチドキュメントは, 例によって, ターゲットリソースに対して行われる一連の変更を記述します。マージパッチドキュメントの受信者は, マージパッチをターゲットリソースの現在の内容と比較して, ターゲットに適用される特定の変更操作セットを決定する責任があります。
マージパッチドキュメントをターゲットリソースに適用するために, システムは次の関数の効果を実現します。これは疑似コードで記述されています。この説明では, 関数は MergePatch と呼ばれ, ターゲットリソースドキュメントとマージパッチドキュメントの 2 つの引数を取ります。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 操作の結果は定義されていません。