Passa al contenuto principale

2. Processing Merge Patch Documents (Elaborazione dei documenti di patch di fusione)

2. Processing Merge Patch Documents (Elaborazione dei documenti di patch di fusione)

I documenti di patch di fusione JSON descrivono, ad esempio, un insieme di modifiche da apportare a una risorsa di destinazione. I destinatari dei documenti di patch di fusione sono responsabili del confronto del patch di fusione con il contenuto corrente della risorsa di destinazione per determinare l'insieme specifico di operazioni di modifica da applicare alla destinazione.

Per applicare il documento di patch di fusione a una risorsa di destinazione, il sistema realizza l'effetto della seguente funzione, descritta in pseudocodice. Per questa descrizione, la funzione è chiamata MergePatch, e prende due argomenti: il documento della risorsa di destinazione e il documento del patch di fusione. L'argomento Target può essere qualsiasi valore JSON o undefined. L'argomento Patch può essere qualsiasi valore 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

Ci sono alcune cose da notare sulla funzione. Se il patch è qualcosa di diverso da un oggetto, il risultato sarà sempre quello di sostituire l'intera destinazione con l'intero patch. Inoltre, non è possibile applicare un patch a una parte di una destinazione che non è un oggetto, come sostituire solo alcuni dei valori in un array.

L'operazione MergePatch è definita per operare a livello di elementi di dati, non a livello di rappresentazione testuale. Non ci si aspetta che l'operazione MergePatch preservi caratteristiche a livello di rappresentazione testuale come spazi bianchi, ordinamento dei membri, precisione numerica oltre a quella disponibile nell'implementazione della destinazione, e così via. Inoltre, anche se l'implementazione di destinazione consente più coppie nome/valore con lo stesso nome, il risultato dell'operazione MergePatch su tali oggetti non è definito.