Usporediti dvije JSON strukture
- Nadzorna ploča
- Dokumentacija
- API
Zašto uspoređivati dva JSON-a?
Usporedba dviju JSON struktura redovito se pojavljuje u životu programera. API odgovor koji se mijenja nakon ažuriranja. Konfiguracijska datoteka koja se razlikuje između dva okruženja. A izvoz objekata koji se moraju uskladiti s referencom. JSON diff precizno odgovara na ovo pitanje: što je dodano, izbrisano ili izmijenjeno i gdje?
Redak po redak diff (a la git diff) često nije dovoljan. Ako je oblikovanje
razlikuje (razmaci, redoslijed tipki), tekstualna razlika javlja stotine redaka dok struktura
podaci su identični. JSON komparator radi na strukturi nakon raščlanjivanja, što to eliminira
šum i samo otkriva semantičke razlike.
Format razlike koju proizvodi alat
Za svako odstupanje, alat vraća:
- put u pojednostavljenom formatu JSONPath, na primjer
$.user.address[0].city; - jedna vrsta među dodanim (dodano s desne strane), uklonjeno (prisutno s lijeve strane samo), modificirano (različite vrijednosti);
- lijeva vrijednost i/ili desna vrijednost ovisno o vrsti.
Prazan diff znači da su dva JSON-a strukturno identična, bez obzira na njihov formatiranje ili redoslijed ključeva.
Kako algoritam prolazi kroz dvije strukture
Algoritam je rekurzivan. Na svakoj razini identificira vrstu dviju vrijednosti koje se uspoređuju:
- Ako su oba asocijativna objekta, potrebna je unija ključeva. Za svaki ključ, rekurzivno se spušta ili označava dodano/uklonjeno ako ključ postoji samo na jednoj strani.
- Ako su oba uređeni nizovi, uspoređuje položaj po položaj. A razlika na početku tablice može pomaknuti sve ostalo, što proizvodi verbose diff: to je a pretpostavljena granica naivne strukturne razlike.
- Ako se tipovi razlikuju (objekt nasuprot nizu, skalarni nasuprot nuli), to je označeno izmijenjeno.
- Ako su obje vrijednosti skalari (string, broj, booleov, null), jednostavan dovoljna je stroga usporedba.
Redoslijed ključeva u objektu nije bitan: {"a": 1, "b": 2} i {"b": 2, "a": 1}
proizvesti prazan razl. Ovo je u skladu sa semantikom JSON-a, gdje redoslijed nema smisla. u
Međutim, redoslijed elemenata niza je bitan: niz je uređen konstrukcijom.
Konkretan primjer
Ovdje su dvije verzije korisničkog objekta:
// lijevo
{
"id": 42,
"ime": "Alice",
"uloge": ["admin", "urednik"]
}
// desno
{
"id": 42,
"ime": "Alice Martin",
"uloge": ["admin", "gledatelj"],
"aktivan": istina
}
Razlika proizvodi:
$.name: modificirano,"Alice"→"Alice Martin"$.roles[1]: modificirano,"uređivač"→"preglednik"$.active: dodano,true
Slučajevi upotrebe
- Različita okruženja: usporedite izlaz krajnje točke u pretprodukciji i u proizvodnje. Vrlo korisno tijekom migracije ili osvježavanja predmemorije.
- Revizija migracije: usporedite izvoz prije i poslije transformacije radi provjere da nijedno polje nije izgubljeno.
- Regresija API-ja: prije i poslije promjene, usporedite odgovor za a identičan upit. Prazan diff potvrđuje da nema regresije.
- Sinkronizacija konfiguracije: usporedite
composer.jsonizmeđu dva grane, dvije.eslintrcdatoteke, dvije Symfony konfiguracije. - Testovi snimki: zamijenite usporedbu redak u redak usporedbom strukturni u skupu integracijskih testova.
Granice strukturne razlike
Uspoređivanje uređenih nizova poznato je ograničenje naivnih strukturnih razlika. Ako ubacimo a element na početku niza, sve sljedeće pozicije se pomiču, a diff signalizira svako odstupanje kao izmjena. Za takve slučajeve postoje napredniji algoritmi (Myers, Patience, diff po prirodnom ključu), ali nadilaze opseg općeg alata za usporedbu.
Diff također ne govori zašto je došlo do promjene: to je opažanje. Za analizu a regresije, ovo opažanje mora biti u usporedbi s obvezama, implementacijama i parametrima upit.
JSON razlika u odnosu na JSON zakrpu (RFC 6902)
Komplementarni format je JSON zakrpa (RFC 6902). Opisuje, u obliku operacija
(dodaj, ukloni, zamijeni, premjesti, kopiraj,
test), kako transformirati jedan JSON dokument u drugi. Gdje je naša razlika zapažanje
(ljudski), JSON zakrpa je recept (strojni). Dvije reprezentacije su ekvivalentne za
jednostavnim slučajevima, a JSON zakrpa korisna je za RESTful API-je koji prihvaćaju izmjene
djelomičan.
Često postavljana pitanja
Ovisi li razlika o redoslijedu ključeva?
Ne: za JSON objekt redoslijed nije značajan. Komparator daje isti rezultat kao ključevi su sortirani ili ne.
Kako rukovati tablicama čiji redoslijed nije važan?
Alat prema zadanim postavkama smatra nizove poredane (ovo je JSON semantika). Ako liječite skupove, poredajte dva niza po prirodnom ključu prije usporedbe ili upotrijebite uslugu specijalizirani alat za usporedbu koji uzima u obzir ovu semantiku.
Koja je razlika s Git diff?
Git uspoređuje retke teksta. Ako se uvlačenje ili redoslijed ključeva razlikuje, Git diff je vrlo opširno. JSON diff radi na raščlanjenoj strukturi i prijavljuje samo nedostatke podataka.
Prihvaća li se nevažeći JSON?
Ne: ako jedan od dva JSON-a ne analizira, alat vraća pogrešku. Prvo potvrdite s našim JSON validator.
Primjer zahtjeva
curl -X POST https://cdrn.fr/api/v1/tools/json-diff/execute \
-H "Content-Type: application/json" \
-d '{"left":"...","right":"..."}'
Ulazna shema
| Polje | Tip | Obavezno | Zadano |
|---|---|---|---|
left |
text | ✓ | – |
right |
text | ✓ | – |
Krajnje točke
GET https://cdrn.fr/api/v1/tools- ispisuje sve dostupne alateGET https://cdrn.fr/api/v1/tools/json-diff- dohvaća shemu ovog alataPOST https://cdrn.fr/api/v1/tools/json-diff/execute- izvršava ovaj alat s JSON payloadom