Eina de Comparació de JSON - Compara JSON en Línia Gratuït | Diferències JSON
Compara JSON en línia gratuïtament amb la nostra ràpida eina de comparació de JSON. Trobeu diferències instantàniament amb resultats codificats per colors. Diferències JSON 100% segures, basades en navegador. No cal registrar-se.
Eina de Diferències JSON
Documentació
Una eina de comparació de JSON, sovint anomenada eina de diff de JSON, compara dos valors JSON (JavaScript Object Notation) i informa del que ha canviat entre aquests valors. Enumera totes les propietats o els elements de matriu afegits, eliminats o modificats, juntament amb la seva ubicació exacta dins de les dades. Aquesta pàgina explica com funciona l’eina de comparació de JSON de whiz.tools, amb exemples resolts basats en la seva lògica de comparació real.
Què és la comparació de JSON?
La comparació de JSON és el procés de comprovar dos documents JSON entre si per trobar-ne les diferències. Un document JSON és un fragment de text format per objectes (parells clau-valor delimitats per claus), matrius (llistes ordenades delimitades per claudàtors) i valors primitius, com ara cadenes, nombres, booleans i null. Comparar aquests dos documents a ull és lent i propens a errors quan superen unes quantes línies, de manera que una eina de comparació fa coincidir els elements automàticament i destaca cada canvi.
Els desenvolupadors utilitzen aquest tipus de comparació per comprovar les respostes de les API, fer un seguiment dels canvis en fitxers de configuració, verificar que una migració de dades no hagi perdut informació i revisar els canvis en fitxers JSON sota control de versions.
Com compara l’eina dos valors JSON
L’eina analitza les dues entrades amb un analitzador JSON estàndard i després recorre conjuntament els dos valors resultants, un nivell cada vegada. A cada pas, formula tres preguntes, en aquest ordre:
- Els dos valors tenen tipus diferents (per exemple, un és un objecte i l’altre és un nombre), o un és
nullmentre que l’altre no? Si és així, registra una modificació en aquell punt i deixa de comparar els nivells més profunds. - Tots dos valors són primitius (una cadena, un nombre, un booleà o null)? Si és així, els compara directament. Qualsevol diferència, inclòs el canvi del nombre
123a la cadena"123", compta com una modificació. - Tots dos valors són objectes o tots dos són matrius? Si és així, compara’n el contingut amb les regles següents i torna a recórrer els objectes o les matrius imbricats.
Cada diferència es registra amb un camí, com ara user.address.city o tags[1], de manera que sigui fàcil trobar-la al document original. Els membres dels objectes s’uneixen amb un punt i els elements de les matrius es mostren amb el seu índex entre claudàtors. Una diferència a la part superior del document, com ara una matriu substituïda per un objecte, no té cap camí dins de les dades, per això se li assigna l’etiqueta $. Aquest és l’identificador de l’arrel definit per l’RFC 9535, l’estàndard JSONPath, i representa tot el document.
Comparació d’objectes
Per a dos objectes JSON, l’eina recopila totes les claus que apareixen en qualsevol dels dos objectes. Per a cada clau:
- Si la clau només existeix en el segon objecte, és una propietat afegida.
- Si la clau només existeix en el primer objecte, és una propietat eliminada.
- Si la clau existeix en tots dos objectes, l’eina compara els dos valors recursivament.
L’ordre de les claus no és rellevant. L’estàndard JSON no defineix cap ordre per als membres dels objectes, de manera que {"a":1,"b":2} i {"b":2,"a":1} es tracten com a idèntics.
Comparació de matrius
Les matrius es comparen per posició, no pas pel contingut. L’eina recorre les dues matrius índex per índex i compara el que hi ha a cada índex, fins a la longitud de la matriu més llarga. Si una matriu és més curta, els elements addicionals del final de la matriu més llarga es notifiquen com a afegits o eliminats.
Això significa que l’eina no intenta fer coincidir els elements de les matrius pel seu contingut. No detecta que un objecte s’hagi «mogut» de l’índex 1 a l’índex 2; només veu que el valor de cada índex ha canviat. Eliminar o inserir un element al mig d’una matriu desplaça un lloc tots els elements següents, de manera que normalment apareix com diverses modificacions separades en lloc d’una única addició o eliminació clara.
Exemple resolt
Exemple 1: comparació de dos objectes
Primer JSON:
1{ "user": { "address": { "city": "New York", "zip": "10001" } } }
2Segon JSON:
1{ "user": { "address": { "city": "Boston", "zip": "02108" } } }
2Resultat:
- Modificat
user.address.city:"New York"→"Boston" - Modificat
user.address.zip:"10001"→"02108"
Exemple 2: un canvi al final d’una matriu
Primer JSON:
1{ "tags": ["important", "urgent", "review"] }
2Segon JSON:
1{ "tags": ["important", "critical", "review", "documentation"] }
2L’índex 0 no canvia, l’índex 1 canvia, l’índex 2 no canvia i l’índex 3 només existeix a la segona matriu. Resultat:
- Modificat
tags[1]:"urgent"→"critical" - Afegit
tags[3]:"documentation"
Exemple 3: eliminació d’un element del mig d’una matriu
Aquest exemple mostra què passa quan s’elimina un element del mig d’una matriu, perquè és una font habitual de confusió.
Primer 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}
8Segon JSON, amb l’entrada «Mouse» eliminada i una entrada «Monitor» afegida al final:
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}
8Una persona que ho mirés diria: «S’ha eliminat Mouse i s’ha afegit Monitor». Com que l’eina compara estrictament per índex, no ho interpreta així. Compara l’índex 0 amb l’índex 0, l’índex 1 amb l’índex 1 i l’índex 2 amb l’índex 2, de manera que cada camp posterior a l’element eliminat queda alineat amb l’objecte equivocat. El resultat real són set modificacions:
- 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
Per obtenir un resultat més clar en comparar llistes com aquesta, ordeneu les dues matrius o establiu-ne les claus de la mateixa manera abans d’enganxar-les; per exemple, escrivint cada llista en el mateix ordre o fent coincidir els objectes mitjançant un camp d’identificador abans de comparar-los.
Què no fa l’eina
- No fa coincidir els elements de les matrius pel contingut. Com es mostra més amunt, compara únicament per posició de l’índex i, per tant, no pot reconèixer que un element s’ha mogut en lloc d’haver canviat.
- No detecta referències circulars. A la pràctica, això no és una limitació: totes dues entrades provenen de
JSON.parse, que sempre construeix un arbre simple i mai no pot produir un valor que faci referència a si mateix. Les referències circulars no poden existir en text JSON vàlid. - No ofereix cap opció per ordenar les matrius abans de comparar-les. Reordenar els elements de l’entrada abans d’enganxar-los és l’única manera d’evitar l’efecte de desplaçament dels índexs descrit més amunt.
Com s’utilitza l’eina
- Enganxeu el primer document JSON al quadre de l’esquerra i el segon al de la dreta.
- L’eina els compara automàticament quan tots dos quadres contenen text; també podeu fer clic a Compara per executar la comparació manualment.
- Llegiu la llista de resultats. Cada línia mostra un camí, com ara
user.age, i indica si s’ha afegit, eliminat o modificat, amb els valors antic i nou mostrats l’un al costat de l’altre. - Feu clic a Copia per copiar els resultats com a text sense format.
Si un quadre conté text que no és JSON vàlid, l’eina mostra un error sota aquest quadre en lloc d’una comparació. Si tots dos quadres no són vàlids, els dos errors apareixen alhora.
Preguntes freqüents
Què compta com una diferència entre dos valors JSON?
Una propietat o un element de matriu és diferent si només existeix en un dels dos documents o si existeix en tots dos però conté un valor o un tipus diferent. Canviar un valor del nombre 5 a la cadena "5" compta com una modificació, encara que puguin semblar similars.
L’ordre dels elements és important? Depèn del contenidor. Els objectes JSON no tenen un ordre de membres definit, de manera que dos objectes amb les mateixes claus i valors en un ordre diferent es tracten com a idèntics. Les matrius són ordenades i l’eina les compara per posició d’índex, de manera que moure un element a una posició diferent es notifica com una sèrie de modificacions i no pas com un moviment.
Què significa un camí de resultat $?
Significa que ha canviat tot el document, no pas una part. Això passa quan les dues entrades són tipus de valor diferents al nivell superior, per exemple, una matriu a un costat i un objecte a l’altre, o els nombres simples 1 i 2. $ és l’identificador de l’arrel de l’RFC 9535, l’estàndard JSONPath.
Les meves dades JSON s’envien a un servidor? No. La comparació s’executa al navegador mitjançant JavaScript. No es puja res.
El format, com ara la sagnia o la minimització, afecta el resultat? No. Totes dues entrades s’analitzen com a valors JSON abans de comparar-les, de manera que els espais en blanc, la sagnia i els salts de línia no tenen cap efecte. Només es comparen les dades reals.
L’eina pot comparar JSON amb comentaris o comes finals? No. El JSON estàndard, tal com es defineix a l’RFC 8259, no permet comentaris ni comes finals. Les entrades que en contenen es rebutgen com a no vàlides.
Referències
- IETF. «The JavaScript Object Notation (JSON) Data Interchange Format». RFC 8259, desembre de 2017.
- IETF. «JavaScript Object Notation (JSON) Patch». RFC 6902, abril de 2013.
- IETF. «JSONPath: Query Expressions for JSON». RFC 9535, febrer de 2024. (La secció 2,2 defineix l’identificador de l’arrel
$.) - Mozilla Developer Network. «JSON.parse()».