Instrument de Comparare JSON - Comparați JSON Online Gratuit | Diferențe JSON
Comparați JSON online gratuit cu instrumentul nostru rapid de comparare JSON. Găsiți diferențele instant cu rezultate color-code. Diferențe JSON 100% securizate, bazate pe browser. Fără înregistrare necesară.
Instrument de Comparare JSON
Documentație
Un instrument de comparare a valorilor JSON, denumit adesea instrument de comparare a diferențelor JSON, compară două valori JSON (JavaScript Object Notation) și raportează ce s-a schimbat între ele. Enumeră fiecare proprietate sau element de matrice adăugat, eliminat ori modificat, împreună cu locația sa exactă în date. Această pagină explică modul în care funcționează instrumentul de comparare JSON whiz.tools, cu exemple aplicate bazate pe logica sa reală de comparare.
Ce este compararea JSON?
Compararea JSON este procesul de verificare reciprocă a două documente JSON pentru identificarea diferențelor. Un document JSON este un fragment de text alcătuit din obiecte (perechi cheie-valoare între acolade), matrice (liste ordonate între paranteze drepte) și valori primitive, precum șiruri de caractere, numere, valori booleene și null. Compararea vizuală a acestor documente devine lentă și predispusă la erori după ce depășesc câteva rânduri, astfel că un instrument de comparare realizează automat potrivirea și evidențiază fiecare modificare.
Dezvoltatorii folosesc acest tip de comparare pentru a verifica răspunsurile API, a urmări modificările din fișierele de configurare, a se asigura că o migrare a datelor nu a pierdut informații și a examina modificările aduse fișierelor JSON în sistemul de control al versiunilor.
Cum compară instrumentul două valori JSON
Instrumentul interpretează ambele intrări cu ajutorul unui parser JSON standard, apoi parcurge împreună cele două valori rezultate, câte un nivel pe rând. La fiecare pas, pune trei întrebări, în ordine:
- Au cele două valori tipuri diferite (de exemplu, una este un obiect, iar cealaltă este un număr) sau una este
null, iar cealaltă nu? Dacă da, înregistrează o modificare în acel punct și oprește compararea la niveluri mai profunde. - Sunt ambele valori primitive (un șir de caractere, un număr, o valoare booleană sau null)? Dacă da, le compară direct. Orice diferență, inclusiv trecerea de la numărul
123la șirul"123", este considerată o modificare. - Sunt ambele valori obiecte sau ambele matrice? Dacă da, compară conținutul lor folosind regulile de mai jos și reia procesul pentru orice obiecte sau matrice imbricate.
Fiecare diferență este înregistrată împreună cu o cale, precum user.address.city sau tags[1], astfel încât să poată fi găsită cu ușurință în documentul original. Membrii obiectelor sunt uniți printr-un punct, iar elementele matricelor sunt afișate cu indexul lor între paranteze drepte. O diferență aflată chiar la nivelul superior al documentului, precum înlocuirea unei matrice cu un obiect, nu are o cale în interiorul datelor, astfel că este etichetată $. Acesta este identificatorul rădăcinii definit de RFC 9535, standardul JSONPath, și reprezintă întregul document.
Compararea obiectelor
Pentru două obiecte JSON, instrumentul colectează fiecare cheie care apare în oricare dintre obiecte. Pentru fiecare cheie:
- Dacă cheia există numai în al doilea obiect, aceasta este o proprietate adăugată.
- Dacă cheia există numai în primul obiect, aceasta este o proprietate eliminată.
- Dacă cheia există în ambele obiecte, instrumentul compară recursiv cele două valori.
Ordinea cheilor nu contează. Standardul JSON nu definește o ordine pentru membrii obiectelor, astfel că {"a":1,"b":2} și {"b":2,"a":1} sunt tratate ca identice.
Compararea matricelor
Matricele sunt comparate după poziție, nu după conținut. Instrumentul parcurge ambele matrice index cu index și compară elementele aflate la fiecare index, până la lungimea celei mai lungi matrice. Dacă una dintre matrice este mai scurtă, elementele suplimentare de la sfârșitul celei mai lungi sunt raportate ca adăugate sau eliminate.
Aceasta înseamnă că instrumentul nu încearcă niciodată să potrivească elementele matricelor după conținut. Nu observă că un obiect a fost „mutat” de la indexul 1 la indexul 2; vede doar că valoarea de la fiecare index s-a schimbat. Ștergerea sau inserarea unui element în mijlocul unei matrice deplasează cu o poziție fiecare element următor, astfel că de obicei apare ca mai multe modificări separate, nu ca o singură adăugare sau eliminare clară.
Exemplu de calcul
Exemplul 1: compararea a două obiecte
Primul JSON:
1{ "user": { "address": { "city": "New York", "zip": "10001" } } }
2Al doilea JSON:
1{ "user": { "address": { "city": "Boston", "zip": "02108" } } }
2Rezultat:
- Modificat
user.address.city:"New York"→"Boston" - Modificat
user.address.zip:"10001"→"02108"
Exemplul 2: o modificare la sfârșitul unei matrice
Primul JSON:
1{ "tags": ["important", "urgent", "review"] }
2Al doilea JSON:
1{ "tags": ["important", "critical", "review", "documentation"] }
2Indexul 0 nu s-a modificat, indexul 1 s-a modificat, indexul 2 nu s-a modificat, iar indexul 3 există numai în a doua matrice. Rezultat:
- Modificat
tags[1]:"urgent"→"critical" - Adăugat
tags[3]:"documentation"
Exemplul 3: eliminarea unui element din mijlocul unei matrice
Acest exemplu arată ce se întâmplă când un element este eliminat din mijlocul unei matrice, deoarece aceasta este o sursă frecventă de confuzie.
Primul 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}
8Al doilea JSON, cu intrarea „Mouse” eliminată și o intrare „Monitor” adăugată la sfârșit:
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}
8Cineva care ar privi acest rezultat ar spune „Mouse a fost eliminat, iar Monitor a fost adăugat”. Deoarece instrumentul compară strict după index, nu vede lucrurile astfel. Compară indexul 0 cu indexul 0, indexul 1 cu indexul 1 și indexul 2 cu indexul 2, astfel că fiecare câmp de după elementul eliminat este aliniat cu obiectul greșit. Rezultatul real constă în șapte modificări:
- Modificat
products[0].price:999.99→899.99 - Modificat
products[1].id:2→3 - Modificat
products[1].name:"Mouse"→"Keyboard" - Modificat
products[1].price:24.99→59.99 - Modificat
products[2].id:3→4 - Modificat
products[2].name:"Keyboard"→"Monitor" - Modificat
products[2].price:59.99→349.99
Pentru a obține un rezultat mai clar la compararea unor liste de acest tip, sortați sau indexați ambele matrice în același mod înainte de a le insera, de exemplu scriind fiecare listă în aceeași ordine sau potrivind obiectele după un câmp ID înainte de comparare.
Ce nu face instrumentul
- Nu potrivește elementele matricelor după conținut. După cum s-a arătat mai sus, compară strict după poziția indexului, astfel că nu poate recunoaște că un element a fost mutat, nu modificat.
- Nu detectează referințele circulare. În practică, aceasta nu este o limitare: ambele intrări provin din
JSON.parse, care construiește întotdeauna un arbore simplu și nu poate produce o valoare care se referă la ea însăși. Referințele circulare nu pot exista în text JSON valid. - Nu oferă o setare pentru sortarea matricelor înainte de comparare. Reordonarea elementelor din intrare înainte de a le insera este singura modalitate de a evita efectul deplasării indicilor descris mai sus.
Cum se utilizează instrumentul
- Inserați primul document JSON în caseta din stânga și al doilea în cea din dreapta.
- Instrumentul le compară automat după ce ambele casete conțin text; pentru a efectua manual comparația, faceți clic pe Compară.
- Citiți lista de rezultate. Fiecare rând afișează o cale, precum
user.age, și indică dacă elementul a fost adăugat, eliminat sau modificat, cu valorile veche și nouă afișate una lângă alta. - Faceți clic pe Copiere pentru a copia rezultatele ca text simplu.
Dacă o casetă conține text care nu este JSON valid, instrumentul afișează o eroare sub caseta respectivă, în locul unei comparații. Când ambele casete sunt invalide, ambele erori apar simultan.
Întrebări frecvente
Ce este considerat o diferență între două valori JSON?
O proprietate sau un element de matrice este diferit dacă există numai în unul dintre cele două documente sau dacă există în ambele, dar conține o valoare diferită ori are un tip diferit. Schimbarea unei valori de la numărul 5 la șirul "5" este considerată o modificare, chiar dacă valorile pot părea similare.
Contează ordinea elementelor? Depinde de container. Obiectele JSON nu au o ordine definită a membrilor, astfel că două obiecte cu aceleași chei și valori, dar într-o ordine diferită, sunt tratate ca identice. Matricele sunt ordonate, iar instrumentul le compară după poziția indexului, astfel că mutarea unui element într-o altă poziție este raportată ca o serie de modificări, nu ca o mutare.
Ce înseamnă o cale de rezultat $?
Înseamnă că s-a modificat întregul document, nu doar o parte a sa. Acest lucru se întâmplă când cele două intrări au tipuri diferite de valoare la nivelul superior, de exemplu o matrice într-o parte și un obiect în cealaltă sau numerele simple 1 și 2. $ este identificatorul rădăcinii din RFC 9535, standardul JSONPath.
Datele mele JSON sunt trimise către un server? Nu. Compararea are loc în browser, cu ajutorul JavaScript. Nimic nu este încărcat.
Formatarea, precum indentarea sau minificarea, influențează rezultatul? Nu. Ambele intrări sunt analizate și transformate în valori JSON înainte de comparare, astfel că spațiile albe, indentarea și întreruperile de rând nu contează. Se compară numai datele efective.
Poate instrumentul să compare JSON cu comentarii sau virgule finale? Nu. JSON standard, astfel cum este definit în RFC 8259, nu permite comentarii sau virgule finale. Intrările care le conțin sunt respinse ca invalide.
Referințe
- IETF. „Formatul de interschimb de date JavaScript Object Notation (JSON).” RFC 8259, decembrie 2017.
- IETF. „JavaScript Object Notation (JSON) Patch.” RFC 6902, aprilie 2013.
- IETF. „JSONPath: expresii de interogare pentru JSON.” RFC 9535, februarie 2024. (Secțiunea 2,2 definește identificatorul rădăcinii
$.) - Mozilla Developer Network. „JSON.parse().”