Palyginti dvi JSON struktūras
- Skydelis
- Dokumentacija
- API
Kam lyginti du JSON?
Dviejų JSON struktūrų palyginimas kūrėjo gyvenime atsiranda reguliariai. API atsakymas kuris pasikeičia po atnaujinimo. Konfigūracijos failas, kuris skiriasi dviejose aplinkose. A objektų, kurie turi būti suderinti su nuoroda, eksportas. JSON skirtumai tiksliai reaguoja šis klausimas: kas buvo pridėta, ištrinta ar pakeista ir kur?
Dažnai nepakaks eilutės po eilutės pateikto diff (a la git diff). Jei formatavimas
skiriasi (tarpai, klavišų tvarka), tekstinis skirtumas pateikia šimtus eilučių, o struktūra
duomenys yra identiški. JSON lyginamoji priemonė veikia su išanalizuota struktūra, todėl tai pašalinama
triukšmo ir atskleidžia tik semantinius skirtumus.
Įrankio sukurto skirtumo formatas
Už kiekvieną nukrypimą įrankis grąžina:
- kelias supaprastintu JSONPath formatu, pvz.,
$.user.address[0].city; - vienas tipas tarp pridėta (pridėta dešinėje), pašalinta (esama kairėje) tik), pakeista (skirtingos reikšmės);
- kairė reikšmė ir (arba) dešinė reikšmė, atsižvelgiant į tipą.
Tuščias skirtumas reiškia, kad abu JSON yra struktūriškai identiški, nepaisant jų formatavimas arba raktų tvarka.
Kaip algoritmas kerta dvi struktūras
Algoritmas yra rekursyvus. Kiekviename lygyje jis nurodo dviejų lyginamų verčių tipą:
- Jei abu yra asociaciniai objektai, reikia klavišų jungties. Kiekvienam raktui, jis rekursyviai nusileidžia arba pažymi pridėtą/pašalintą, jei raktas yra tik vienoje pusėje.
- Jei abu yra sutvarkyti masyvai, lygina pozicija pagal poziciją. A Skirtumas lentelės pradžioje gali pakeisti visa kita, o tai sukuria žodinį skirtumą: tai a tariama naivaus struktūrinio skirtumo riba.
- Jei tipai skiriasi (objektas ir masyvas, skaliarinis ir nulis), jis pažymėtas pakeista.
- Jei abi reikšmės yra skaliarai (eilutė, skaičius, loginė vertė, nulis), paprastas pakanka griežto palyginimo.
Raktų tvarka objekte nesvarbi: {"a": 1, "b": 2} ir {"b": 2, "a": 1}
sukurti tuščią skirtumą. Tai atitinka JSON semantiką, kur tvarka nėra prasminga. Į
Tačiau svarbi yra masyvo elementų tvarka: masyvas yra išdėstytas pagal konstrukciją.
Konkretus pavyzdys
Štai dvi vartotojo objekto versijos:
// liko
{
"id": 42,
"vardas": "Alisa",
"vaidmenys": ["administratorius", "redaktorius"]
}
// teisingai
{
"id": 42,
"vardas": "Alisa Martin",
"roles": ["administratorius", "žiūrovas"],
„aktyvus“: tiesa
}
Skirtumas sukuria:
$.name: pakeista,"Alisa"→"Alisa Martin"$.roles[1]: pakeista,"redagavimo priemonė"→"žiūryklė"$.active: pridėta,true
Naudojimo atvejai
- Skirtingos aplinkos: palyginkite galutinio taško išvestį prieš gamybą ir gamyba. Labai naudinga perkeliant arba atnaujinant talpyklą.
- Perėjimo auditas: palyginkite eksportą prieš ir po transformacijos, kad patikrintumėte kad nebuvo prarasti laukai.
- API regresija: prieš ir po pakeitimo palyginkite a atsaką identiška užklausa. Tuščias skirtumas patvirtina, kad nėra regresijos.
- Konfigūracijos sinchronizavimas: palyginkite dviejų
composer.jsonšakos, du.eslintrcfailai, dvi Symfony konfigūracijos. - Momentinių nuotraukų testai: palyginimą iš eilės pakeiskite palyginimu struktūrinis integravimo testų rinkinyje.
Struktūrinio skirtumo ribos
Sutvarkytų masyvų palyginimas yra žinomas naivių struktūrinių skirtumų apribojimas. Jei įterpsime a elementas masyvo pradžioje, visos paskesnės pozicijos pasislenka, o skirtumas signalizuoja apie kiekvieną nukrypimą kaip modifikaciją. Tokiais atvejais egzistuoja pažangesni algoritmai (Myers, Patience, diff pagal natūralų raktą), tačiau jie nepatenka į bendro palyginimo įrankio taikymo sritį.
Skirtumas taip pat nepasako, kodėl įvyko pokytis: tai yra pastebėjimas. Norėdami išanalizuoti a regresija, šis stebėjimas turi būti susietas su įsipareigojimais, diegimais ir parametrais užklausą.
JSON skirtumas ir JSON pataisa (RFC 6902)
Papildomas formatas yra JSON pataisa (RFC 6902). Jis aprašomas operacijų forma
(pridėti, pašalinti, pakeisti, perkelti, kopijuoti,
testas), kaip vieną JSON dokumentą paversti kitu. Kur mūsų skirtumas yra stebėjimas
(žmogus), JSON Patch yra receptas (mašina). Abu atvaizdai yra lygiaverčiai
paprastais atvejais, o JSON pataisa yra naudinga RESTful API, kurios priima pakeitimus
dalinis.
Dažnai užduodami klausimai
Ar skirtumas priklauso nuo raktų tvarkos?
Ne: JSON objektui tvarka nėra reikšminga. Palyginimo priemonė duoda tokį patį rezultatą kaip raktai surūšiuoti ar ne.
Kaip tvarkyti lenteles, kurių tvarka nėra svarbi?
Įrankis pagal numatytuosius nustatymus laiko masyvus išdėstytais (tai yra JSON semantika). Jei gydote rinkinius, prieš palygindami surūšiuokite du masyvus pagal natūralų raktą arba naudokite paslaugą specializuota palyginimo priemonė, kuri atsižvelgia į šią semantiką.
Kuo skiriasi Git skirtumas?
Git lygina teksto eilutes. Jei įtrauka arba raktų tvarka skiriasi, Git skirtumas yra labai didelis žodinis. JSON skirtumai veikia išnagrinėtoje struktūroje ir praneša tik apie duomenų spragas.
Ar priimtas netinkamas JSON?
Ne: jei vienas iš dviejų JSON neanalizuojamas, įrankis grąžina klaidą. Pirmiausia patvirtinkite mūsų JSON patvirtinimo priemonė.
Užklausos pavyzdys
curl -X POST https://cdrn.fr/api/v1/tools/json-diff/execute \
-H "Content-Type: application/json" \
-d '{"left":"...","right":"..."}'
Įvesties schema
| Laukas | Tipas | Privalomas | Numatytasis |
|---|---|---|---|
left |
text | ✓ | – |
right |
text | ✓ | – |
Galiniai taškai
GET https://cdrn.fr/api/v1/tools- išvardija visus galimus įrankiusGET https://cdrn.fr/api/v1/tools/json-diff- gauna šio įrankio schemąPOST https://cdrn.fr/api/v1/tools/json-diff/execute- vykdo šį įrankį su JSON payload