Vai al contenuto

Strumento di Confronto JSON - Confronta JSON Online Gratis | Differenze JSON

Confronta JSON online gratuitamente con il nostro veloce strumento di confronto JSON. Trova le differenze istantaneamente con risultati codificati a colori. Diff JSON 100% sicuro, basato sul browser. Nessuna registrazione necessaria.

Strumento di Confronto JSON

Calcolatore di caricamento...
📚

Documentazione

Uno strumento di confronto JSON, spesso chiamato strumento di diff JSON, confronta due valori JSON (JavaScript Object Notation) e segnala cosa è cambiato tra loro. Elenca ogni proprietà o elemento di array aggiunto, rimosso o modificato, insieme alla sua posizione esatta nei dati. Questa pagina spiega come funziona lo strumento di confronto JSON di whiz.tools, con esempi pratici basati sulla sua logica effettiva di confronto.

Che cos'è il confronto JSON?

Il confronto JSON è il processo di verifica reciproca di due documenti JSON per individuare le differenze. Un documento JSON è un testo composto da oggetti (coppie chiave-valore tra parentesi graffe), array (elenchi ordinati tra parentesi quadre) e valori primitivi come stringhe, numeri, valori booleani e null. Confrontare a occhio due documenti di questo tipo diventa lento e soggetto a errori quando superano poche righe, quindi uno strumento di confronto esegue automaticamente l'associazione e mette in evidenza ogni modifica.

Gli sviluppatori usano questo tipo di confronto per verificare le risposte delle API, tenere traccia delle modifiche nei file di configurazione, controllare che una migrazione dei dati non abbia causato perdite di informazioni e revisionare le modifiche ai file JSON nei sistemi di controllo versione.

Come lo strumento confronta due valori JSON

Lo strumento analizza entrambi gli input con un parser JSON standard, poi percorre insieme i due valori risultanti, un livello alla volta. A ogni passaggio pone tre domande, nell'ordine:

  1. I due valori hanno tipi diversi (per esempio, uno è un oggetto e l'altro è un numero), oppure uno è null mentre l'altro non lo è? In tal caso registra una modifica in quel punto e interrompe il confronto dei livelli più profondi.
  2. Entrambi i valori sono primitivi (una stringa, un numero, un valore booleano o null)? In tal caso li confronta direttamente. Qualsiasi differenza, incluso il passaggio dal numero 123 alla stringa "123", è considerata una modifica.
  3. Entrambi i valori sono oggetti o entrambi sono array? In tal caso ne confronta i contenuti secondo le regole riportate di seguito e ripete il confronto negli oggetti o negli array annidati.

Ogni differenza viene registrata con un percorso, come user.address.city o tags[1], così è facile trovarla nel documento originale. I membri degli oggetti sono separati da un punto e gli elementi degli array sono indicati con il relativo indice tra parentesi quadre. Una differenza nella parte superiore del documento, come un array sostituito da un oggetto, non ha un percorso all'interno dei dati, quindi viene indicata come $. Questo è l'identificatore della radice definito da RFC 9535, lo standard JSONPath, e rappresenta l'intero documento.

Confronto degli oggetti

Per due oggetti JSON, lo strumento raccoglie ogni chiave presente in almeno uno dei due oggetti. Per ciascuna chiave:

  • Se la chiave esiste solo nel secondo oggetto, si tratta di una proprietà aggiunta.
  • Se la chiave esiste solo nel primo oggetto, si tratta di una proprietà rimossa.
  • Se la chiave esiste in entrambi, lo strumento confronta ricorsivamente i due valori.

L'ordine delle chiavi non è importante. Lo standard JSON non definisce un ordine per i membri degli oggetti, quindi {"a":1,"b":2} e {"b":2,"a":1} vengono considerati identici.

Confronto degli array

Gli array vengono confrontati in base alla posizione, non al contenuto. Lo strumento percorre entrambi gli array indice per indice e confronta ciò che si trova in ciascun indice, fino alla lunghezza dell'array più lungo. Se un array è più corto, gli elementi aggiuntivi alla fine dell'array più lungo vengono segnalati come aggiunti o rimossi.

Questo significa che lo strumento non prova mai ad associare gli elementi degli array in base al loro contenuto. Non rileva che un oggetto è stato «spostato» dall'indice 1 all'indice 2; rileva soltanto che il valore in ciascun indice è cambiato. L'eliminazione o l'inserimento di un elemento nel mezzo di un array sposta di una posizione ogni elemento successivo, quindi di solito viene mostrato come diverse modifiche separate anziché come una singola aggiunta o rimozione.

Esempi pratici

Esempio 1: confronto di due oggetti

Primo JSON:

1{ "user": { "address": { "city": "New York", "zip": "10001" } } }
2

Secondo JSON:

1{ "user": { "address": { "city": "Boston", "zip": "02108" } } }
2

Risultato:

  • Modificato user.address.city: "New York" → "Boston"
  • Modificato user.address.zip: "10001" → "02108"

Esempio 2: modifica alla fine di un array

Primo JSON:

1{ "tags": ["important", "urgent", "review"] }
2

Secondo JSON:

1{ "tags": ["important", "critical", "review", "documentation"] }
2

L'indice 0 non è cambiato, l'indice 1 è cambiato, l'indice 2 non è cambiato e l'indice 3 esiste solo nel secondo array. Risultato:

  • Modificato tags[1]: "urgent" → "critical"
  • Aggiunto tags[3]: "documentation"

Esempio 3: rimozione di un elemento dal mezzo di un array

Questo esempio mostra cosa accade quando un elemento viene rimosso dal mezzo di un array, una situazione che causa spesso confusione.

Primo JSON:

1{
2  "products": [
3    { "id": 1, "name": "Laptop", "price": 999.99 },
4    { "id": 2, "name": "Mouse", "price": 24.99 },
5    { "id": 3, "name": "Keyboard", "price": 59.99 }
6  ]
7}
8

Secondo JSON, con la voce "Mouse" eliminata e una voce "Monitor" aggiunta alla fine:

1{
2  "products": [
3    { "id": 1, "name": "Laptop", "price": 899.99 },
4    { "id": 3, "name": "Keyboard", "price": 59.99 },
5    { "id": 4, "name": "Monitor", "price": 349.99 }
6  ]
7}
8

Osservando i dati, si direbbe che «Mouse è stato rimosso e Monitor è stato aggiunto». Poiché lo strumento confronta rigorosamente in base all'indice, non interpreta però la modifica in questo modo. Confronta l'indice 0 con l'indice 0, l'indice 1 con l'indice 1 e l'indice 2 con l'indice 2, quindi ogni campo successivo all'elemento eliminato viene confrontato con l'oggetto sbagliato. Il risultato effettivo è di sette modifiche:

  • Modificato products[0].price: 999.99 → 899.99
  • Modificato products[1].id: 2 → 3
  • Modificato products[1].name: "Mouse" → "Keyboard"
  • Modificato products[1].price: 24.99 → 59.99
  • Modificato products[2].id: 3 → 4
  • Modificato products[2].name: "Keyboard" → "Monitor"
  • Modificato products[2].price: 59.99 → 349.99

Per ottenere un risultato più chiaro quando si confrontano elenchi di questo tipo, è possibile ordinare entrambi gli array nello stesso modo o strutturarli con la stessa chiave prima di incollarli, per esempio scrivendo ogni elenco nello stesso ordine oppure associando gli oggetti tramite un campo ID prima del confronto.

Cosa non fa lo strumento

  • Non associa gli elementi degli array in base al contenuto. Come mostrato sopra, confronta esclusivamente le posizioni degli indici, quindi non è in grado di riconoscere che un elemento è stato spostato anziché modificato.
  • Non rileva i riferimenti circolari. Nella pratica, questo non rappresenta una limitazione: entrambi gli input provengono da JSON.parse, che costruisce sempre un semplice albero e non può produrre un valore che faccia riferimento a sé stesso. I riferimenti circolari non possono esistere nel testo JSON valido.
  • Non offre un'impostazione per ordinare gli array prima del confronto. Riordinare gli elementi nell'input prima di incollarli è l'unico modo per evitare l'effetto dello spostamento degli indici descritto sopra.

Come usare lo strumento

  1. Incollare il primo documento JSON nel riquadro a sinistra e il secondo in quello a destra.
  2. Lo strumento li confronta automaticamente quando entrambi i riquadri contengono testo; in alternativa, fare clic su «Confronta» per avviare manualmente il confronto.
  3. Leggere l'elenco dei risultati. Ogni riga mostra un percorso, come user.age, e indica se l'elemento è stato aggiunto, rimosso o modificato, con i valori precedente e nuovo mostrati affiancati.
  4. Fare clic su «Copia» per copiare i risultati come testo semplice.

Se un riquadro contiene testo che non è JSON valido, lo strumento mostra un errore sotto quel riquadro invece di eseguire il confronto. Se entrambi i riquadri non sono validi, i due errori vengono mostrati contemporaneamente.

Domande frequenti

Che cosa conta come differenza tra due valori JSON?
Una proprietà o un elemento di array è diverso se esiste in uno solo dei due documenti oppure se esiste in entrambi ma contiene un valore o un tipo diverso. Il passaggio dal numero 5 alla stringa "5" conta come modifica, anche se i due valori possono sembrare simili.

L'ordine degli elementi è importante?
Dipende dal contenitore. Gli oggetti JSON non hanno un ordine definito per i membri, quindi due oggetti con le stesse chiavi e gli stessi valori disposti in un ordine diverso vengono considerati identici. Gli array sono ordinati e lo strumento li confronta in base alla posizione dell'indice, quindi lo spostamento di un elemento in un'altra posizione viene segnalato come una serie di modifiche anziché come uno spostamento.

Che cosa significa un percorso del risultato pari a $?
Significa che è cambiato l'intero documento, non una sua singola parte. Questo accade quando i due input sono valori di tipo diverso al livello superiore, per esempio un array da un lato e un oggetto dall'altro, oppure i numeri semplici 1 e 2. $ è l'identificatore della radice definito da RFC 9535, lo standard JSONPath.

I miei dati JSON vengono inviati a un server?
No. Il confronto viene eseguito nel browser tramite JavaScript. Non viene caricato nulla.

La formattazione, come l'indentazione o la minimizzazione, influisce sul risultato?
No. Entrambi gli input vengono analizzati e trasformati in valori JSON prima del confronto, quindi spazi bianchi, indentazione e interruzioni di riga non fanno alcuna differenza. Vengono confrontati soltanto i dati effettivi.

Lo strumento può confrontare JSON con commenti o virgole finali?
No. Il JSON standard, come definito da RFC 8259, non consente commenti o virgole finali. L'input che li contiene viene rifiutato come non valido.

Riferimenti

  1. IETF. «The JavaScript Object Notation (JSON) Data Interchange Format». RFC 8259, dicembre 2017.
  2. IETF. «JavaScript Object Notation (JSON) Patch». RFC 6902, aprile 2013.
  3. IETF. «JSONPath: Query Expressions for JSON». RFC 9535, febbraio 2024. (La sezione 2.2 definisce l'identificatore della radice $.)
  4. Mozilla Developer Network. «JSON.parse()».