Vertaa kahta JSON-rakennetta
- Hallintapaneeli
- Dokumentaatio
- API
Miksi verrata kahta JSON-tiedostoa?
Kahden JSON-rakenteen vertailu on yleistä kehittäjän elämässä. API-vastaus, joka muuttuu päivityksen jälkeen. Kokoonpanotiedosto, joka eroaa kahden ympäristön välillä. Objektien vienti, jonka on oltava linjassa referenssin kanssa. JSON-diff vastaa täsmälleen tähän kysymykseen: mitä on lisätty, poistettu tai muutettu ja missä kohdassa?
Rivi riviltä tehtävä diff (kuten git diff) ei useinkaan riitä. Jos muotoilu eroaa (välilyönnit, avainten järjestys), tekstuaalinen diff ilmoittaa sadoista riveistä, vaikka tietorakenne on identtinen. JSON-vertailija toimii jäsennellyn rakenteen parissa, mikä poistaa tämän kohinan ja paljastaa vain semanttiset erot.
Työkalun tuottaman diffin muoto
Jokaisesta erosta työkalu palauttaa:
- polun yksinkertaistetussa JSONPath-muodossa, esimerkiksi
$.user.address[0].city; - tyypin: added (lisätty oikealle), removed (läsnä vain vasemmalla), modified (eri arvot);
- vasemman arvon ja/tai oikean arvon tyypistä riippuen.
Tyhjä diff tarkoittaa, että molemmat JSON-tiedostot ovat rakenteellisesti identtisiä, riippumatta niiden muotoilusta tai avainten järjestyksestä.
Kuinka algoritmi käy läpi molemmat rakenteet
Algoritmi on rekursiivinen. Jokaisella tasolla se tunnistaa kahden verrattavan arvon tyypin:
- Jos molemmat ovat assosiatiivisia objekteja, se ottaa avainten unionin. Jokaisen avaimen kohdalla se laskeutuu rekursiivisesti tai merkitsee added/removed, jos avain ei ole olemassa vain toisella puolella.
- Jos molemmat ovat järjestettyjä taulukoita, se vertaa niitä sijainti kerrallaan. Ero taulukon alussa voi siirtää kaikkea muuta, mikä tuottaa monisanaisen diffin: tämä on naiivin rakenteellisen diffin tunnettu rajoitus.
- Jos tyypit eroavat (objekti vs. taulukko, skalaari vs. null), se merkitään modified.
- Jos molemmat arvot ovat skalaareja (merkkijono, luku, totuusarvo, null), yksinkertainen tiukka vertailu riittää.
Avainten järjestys objektissa ei merkitse mitään: {"a": 1, "b": 2} ja {"b": 2, "a": 1} tuottavat tyhjän diffin. Tämä on JSON-semantiikan mukaista, jossa järjestys ei ole merkityksellinen. Sitä vastoin taulukon elementtien järjestys merkitsee: taulukko on rakenteellisesti järjestetty.
Konkreettinen esimerkki
Tässä on kaksi versiota käyttäjäobjektista:
// vasen
{
"id": 42,
"name": "Alice",
"roles": ["admin", "editor"]
}
// oikea
{
"id": 42,
"name": "Alice Martin",
"roles": ["admin", "viewer"],
"active": true
}
Tuotettu diff:
$.name: modified,"Alice"→"Alice Martin"$.roles[1]: modified,"editor"→"viewer"$.active: added,true
Käyttötapaukset
- Ympäristöjen diff: vertaa endpointin tulosta esituotannossa ja tuotannossa. Erittäin hyödyllinen migraation tai välimuistin päivityksen yhteydessä.
- Migraation auditointi: vertaa vientiä ennen ja jälkeen muunnoksen varmistaaksesi, ettei kenttiä ole kadonnut.
- API-regressio: vertaa vastausta samaan pyyntöön ennen ja jälkeen muutoksen. Tyhjä diff vahvistaa, ettei regressiota ole tapahtunut.
- Konfiguraatioiden synkronointi: vertaa
composer.json-tiedostoa kahden oksan välillä, kahta.eslintrc-tiedostoa tai kahta Symfony-konfiguraatiota. - Snapshot-testit: korvaa rivi riviltä tehtävä vertailu rakenteellisella vertailulla integraatiotestien sarjassa.
Rakenteellisen diffin rajoitukset
Järjestettyjen taulukoiden vertailu on naiivien rakenteellisten diffien tunnettu rajoitus. Jos taulukon alkuun lisätään elementti, kaikki seuraavat sijainnit siirtyvät ja diff ilmoittaa jokaisen eron muutoksena. Tällaisia tapauksia varten on olemassa kehittyneempiä algoritmeja (Myers, Patience, diff luonnollisen avaimen mukaan), mutta ne eivät kuulu yleiskäyttöisen vertailutyökalun piiriin.
Diff ei myöskään kerro, miksi muutos tapahtui: se on vain toteamus. Regression analysoimiseksi tämä toteamus on yhdistettävä commiteihin, käyttöönottoihin ja pyynnön parametreihin.
JSON diff vs JSON Patch (RFC 6902)
Täydentävä muoto on JSON Patch (RFC 6902). Se kuvaa operaatioiden (add, remove, replace, move, copy, test) muodossa, kuinka JSON-dokumentti muunnetaan toiseksi. Siinä missä meidän diffimme on toteamus (ihmiselle), JSON Patch on resepti (koneelle). Molemmat esitystavat ovat vastakkaisia yksinkertaisissa tapauksissa, ja JSON Patch on hyödyllinen RESTful-rajapinnoissa, jotka sallivat osittaiset muutokset.
Usein kysytyt kysymykset
Riippuuko diff avainten järjestyksestä?
Ei: JSON-objektissa järjestys ei ole merkityksellinen. Vertailija tuottaa saman tuloksen riippumatta siitä, onko avaimet lajiteltu vai ei.
Kuinka käsitellä taulukoita, joiden järjestyksellä ei ole väliä?
Työkalu pitää oletusarvoisesti taulukoita järjestettyinä (tämä on JSON-semantiikka). Jos käsittelet joukkoja, lajittele molemmat taulukot luonnollisen avaimen mukaan ennen vertailua tai käytä erikoistunutta vertailupalvelua, joka ottaa tämän semantiikan huomioon.
Mitä eroa on Git-diffillä?
Git vertaa tekstirivejä. Jos sisennys tai avainten järjestys eroaa, Git-diff on erittäin monisanainen. JSON-diff toimii jäsennellyn rakenteen parissa ja ilmoittaa vain tietoeroista.
Hyväksytäänkö virheellinen JSON?
Ei: jos kumpikaan JSON ei jäsenny, työkalu palauttaa virheen. Validoi se ensin JSON-validaattorillamme.
Pyyntöesimerkki
curl -X POST https://cdrn.fr/api/v1/tools/json-diff/execute \
-H "Content-Type: application/json" \
-d '{"left":"...","right":"..."}'
Syöteskeema
| Kenttä | Tyyppi | Pakollinen | Oletus |
|---|---|---|---|
left |
text | ✓ | – |
right |
text | ✓ | – |
Päätepisteet
GET https://cdrn.fr/api/v1/tools- listaa kaikki saatavilla olevat työkalutGET https://cdrn.fr/api/v1/tools/json-diff- hakee tämän työkalun skeemanPOST https://cdrn.fr/api/v1/tools/json-diff/execute- suorittaa tämän työkalun JSON-payloadilla