JSON Võrdlemise Tööriist - Võrdle JSON-i Veebis Tasuta | JSON Erinevused
Võrdle JSON-i veebis tasuta meie kiire JSON võrdlemise tööriistaga. Leia erinevused koheselt värviliselt märgitud tulemustega. 100% turvaline, brauseris põhinev JSON erinevuste võrdlus. Registreerumine pole vajalik.
JSON Erinevuste Tööriist
Dokumentatsioon
JSON-i võrdlustööriist, mida sageli nimetatakse JSON-i erinevuste tööriistaks, võrdleb kahte JSON-i (JavaScripti objektimärgenduse) väärtust ja teatab, mis nende vahel muutus. See loetleb kõik lisatud, eemaldatud või muudetud atribuudid ja massiiviüksused koos nende täpse asukohaga andmetes. Sellel lehel selgitatakse, kuidas whiz.toolsi JSON-i võrdlustööriist töötab, kasutades näiteid, mis põhinevad selle tegelikul võrdlusloogikal.
Mis on JSON-i võrdlemine?
JSON-i võrdlemine on kahe JSON-dokumendi kõrvutamise protsess erinevuste leidmiseks. JSON-dokument on tekst, mis koosneb objektidest (võtme-väärtuse paarid looksulgudes), massiividest (järjestatud loendid nurksulgudes) ja primitiivsetest väärtustest, nagu stringid, arvud, tõeväärtused ja null. Kahe sellise dokumendi silmaga võrdlemine on aeglane ja vigaderohke, kui need kasvavad mõnest reast pikemaks, seega teeb võrdlustööriist sobitamise automaatselt ja tõstab iga muudatuse esile.
Arendajad kasutavad sellist võrdlust API vastuste kontrollimiseks, konfiguratsioonifailide muudatuste jälgimiseks, andmemigratsiooni käigus teabe kadumise välistamiseks ning versioonihalduses olevate JSON-failide muudatuste ülevaatamiseks.
Kuidas tööriist kahte JSON-i väärtust võrdleb
Tööriist parsib mõlemad sisendid standardse JSON-parseriga ja läbib seejärel kaks saadud väärtust koos, üks tasand korraga. Igal sammul esitab see järjekorras kolm küsimust:
- Kas need kaks väärtust on eri tüüpi (näiteks üks on objekt ja teine arv) või on üks neist
null, teine aga mitte? Kui jah, märgib see selles kohas muudatuse ja lõpetab sügavama võrdlemise. - Kas mõlemad väärtused on primitiivsed (string, arv, tõeväärtus või null)? Kui jah, võrdleb see neid otse. Iga erinevus, sealhulgas muutus arvust
123stringiks"123", loetakse muudatuseks. - Kas mõlemad väärtused on objektid või mõlemad massiivid? Kui jah, võrdleb see nende sisu allolevate reeglite järgi ning läbib rekursiivselt kõik pesastatud objektid ja massiivid.
Iga erinevus salvestatakse koos teega, näiteks user.address.city või tags[1], et seda oleks algdokumendis lihtne leida. Objekti liikmed ühendatakse punktiga ja massiiviüksused kuvatakse nende indeksiga nurksulgudes. Dokumendi kõige ülemisel tasandil esineval erinevusel, näiteks kui massiiv asendatakse objektiga, ei ole andmetesisest teed, seega tähistatakse seda märgisega $. See on RFC 9535-s määratletud juurtähis, JSONPathi standardi tähis, mis tähistab kogu dokumenti.
Objektide võrdlemine
Kahe JSON-objekti puhul kogub tööriist kõik võtmed, mis esinevad ühes või teises objektis. Iga võtme puhul:
- Kui võti esineb ainult teises objektis, on see lisatud atribuut.
- Kui võti esineb ainult esimeses objektis, on see eemaldatud atribuut.
- Kui võti esineb mõlemas, võrdleb tööriist kahte väärtust rekursiivselt.
Võtmete järjekord ei ole oluline. JSON-i standard ei määra objekti liikmetele järjekorda, seega käsitletakse väärtusi {"a":1,"b":2} ja {"b":2,"a":1} samadena.
Massiivide võrdlemine
Massiive võrreldakse asukoha, mitte sisu järgi. Tööriist liigub mõlemas massiivis indekshaaval ja võrdleb iga indeksi väärtust kuni pikema massiivi lõpuni. Kui üks massiiv on lühem, teatatakse pikema massiivi lõpus olevad lisaüksused lisatud või eemaldatud üksustena.
See tähendab, et tööriist ei püüa kunagi massiiviüksusi nende sisu järgi sobitada. See ei tuvasta, et objekt „liigutati” indeksilt 1 indeksile 2; ta näeb ainult, et iga indeksi väärtus muutus. Üksuse kustutamine või lisamine massiivi keskel nihutab kõiki järgnevaid üksusi ühe koha võrra, mistõttu kuvatakse see tavaliselt mitme eraldi muudatusena, mitte ühe selge lisamise või eemaldamisena.
Näidisarvutus
Näide 1: kahe objekti võrdlemine
Esimene JSON:
1{ "user": { "address": { "city": "New York", "zip": "10001" } } }
2Teine JSON:
1{ "user": { "address": { "city": "Boston", "zip": "02108" } } }
2Tulemus:
- Muudetud
user.address.city:"New York"→"Boston" - Muudetud
user.address.zip:"10001"→"02108"
Näide 2: massiivi muutus lõpus
Esimene JSON:
1{ "tags": ["important", "urgent", "review"] }
2Teine JSON:
1{ "tags": ["important", "critical", "review", "documentation"] }
2Indeks 0 ei muutunud, indeks 1 muutus, indeks 2 ei muutunud ja indeks 3 esineb ainult teises massiivis. Tulemus:
- Muudetud
tags[1]:"urgent"→"critical" - Lisatud
tags[3]:"documentation"
Näide 3: üksuse eemaldamine massiivi keskelt
See näide näitab, mis juhtub, kui üksus massiivi keskelt eemaldatakse, sest see põhjustab sageli segadust.
Esimene 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}
8Teine JSON, millest „Mouse” kirje on kustutatud ja mille lõppu on lisatud „Monitor” kirje:
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}
8Seda vaadates ütleks inimene: „Mouse eemaldati ja Monitor lisati.” Kuna tööriist võrdleb rangelt indeksite järgi, ei näe ta seda nii. Ta võrdleb indeksit 0 indeksiga 0, indeksit 1 indeksiga 1 ja indeksit 2 indeksiga 2, mistõttu joondub iga kustutatud üksusele järgnev väli vale objektiga. Tegelik tulemus on seitse muudatust:
- Muudetud
products[0].price:999.99→899.99 - Muudetud
products[1].id:2→3 - Muudetud
products[1].name:"Mouse"→"Keyboard" - Muudetud
products[1].price:24.99→59.99 - Muudetud
products[2].id:3→4 - Muudetud
products[2].name:"Keyboard"→"Monitor" - Muudetud
products[2].price:59.99→349.99
Selliste loendite võrdlemisel puhtama tulemuse saamiseks sortige või võtmetage mõlemad massiivid enne nende sisestamist samal viisil, näiteks kirjutage mõlemad loendid samas järjekorras või sobitage objektid enne võrdlemist ID-välja järgi.
Mida tööriist ei tee
- See ei sobita massiiviüksusi sisu järgi. Nagu eespool näidatud, võrdleb see ainult indeksipositsiooni järgi ega suuda tuvastada, et üksus liikus, mitte ei muutunud.
- See ei tuvasta ringviiteid. Praktikas ei ole see piirang oluline: mõlemad sisendid pärinevad
JSON.parse-ist, mis loob alati lihtsa puu ega saa tekitada väärtust, mis viitaks iseendale. Ringviiteid ei saa kehtivas JSON-tekstis üldse esineda. - See ei paku seadistust massiivide enne võrdlemist sortimiseks. Üksuste ümberjärjestamine sisendis enne nende kleepimist on ainus viis vältida eespool kirjeldatud indeksinihke mõju.
Kuidas tööriista kasutada
- Kleepige esimene JSON-dokument vasakusse kasti ja teine paremasse kasti.
- Tööriist võrdleb neid automaatselt, kui mõlemas kastis on tekst, või klõpsake võrdluse käsitsi käivitamiseks nupul Compare.
- Lugege tulemuste loendit. Igal real kuvatakse tee, näiteks
user.age, ning näidatakse, kas väärtus lisati, eemaldati või muudeti; vana ja uus väärtus kuvatakse kõrvuti. - Klõpsake tulemuste lihttekstina kopeerimiseks nupul Copy.
Kui kast sisaldab teksti, mis ei ole kehtiv JSON, kuvab tööriist võrdluse asemel selle kasti all veateate. Kui mõlemad kastid on vigased, kuvatakse mõlemad veateated korraga.
Korduma kippuvad küsimused
Mida loetakse kahe JSON-i väärtuse erinevuseks?
Atribuut või massiiviüksus on erinev, kui see esineb ainult ühes dokumendis või kui see esineb mõlemas, kuid sisaldab erinevat väärtust või on teist tüüpi. Väärtuse muutmine arvust 5 stringiks "5" loetakse muudatuseks, kuigi need võivad paista sarnased.
Kas üksuste järjekord on oluline? See sõltub konteinerist. JSON-objektidel ei ole liikmete määratud järjekorda, seega käsitletakse sama võtmete ja väärtustega, kuid eri järjekorras objekte identsetena. Massiivid on järjestatud ja tööriist võrdleb neid indeksipositsiooni järgi, mistõttu üksuse teisaldamine teise kohta teatatakse muudatuste jadana, mitte teisaldamisena.
Mida tähendab tulemuse tee $?
See tähendab, et muutus toimus kogu dokumendis, mitte selle ühes osas. Nii juhtub siis, kui sisendid on tipptasemel eri tüüpi väärtused, näiteks ühel pool massiiv ja teisel pool objekt, või lihtarvud 1 ja 2. $ on RFC 9535-st pärit juurtähis, mida kasutatakse JSONPathi standardis.
Kas minu JSON-andmed saadetakse serverisse? Ei. Võrdlus toimub brauseris JavaScripti abil. Midagi ei laadita üles.
Kas vormindus, näiteks taane või minimeerimine, mõjutab tulemust? Ei. Mõlemad sisendid parsitakse enne võrdlemist JSON-i väärtusteks, seega tühikud, taanded ja reavahetused ei mõjuta tulemust. Võrreldakse ainult tegelikke andmeid.
Kas tööriist saab võrrelda kommentaaride või lõpus olevate komadega JSON-i? Ei. RFC 8259-s määratletud standardne JSON ei luba kommentaare ega lõpus olevaid komasid. Neid sisaldav sisend lükatakse vigasena tagasi.
Viited
- IETF. „The JavaScript Object Notation (JSON) Data Interchange Format.” RFC 8259, detsember 2017.
- IETF. „JavaScript Object Notation (JSON) Patch.” RFC 6902, aprill 2013.
- IETF. „JSONPath: Query Expressions for JSON.” RFC 9535, veebruar 2024. (Jaotis 2,2 määratleb juurtähise
$.) - Mozilla Developer Network. „JSON.parse().”