Primerjati dve JSON strukturi

primerja dve JSON strukturi in navaja dodajanja, brisanja in spremembe, ključ za ključem

Zakaj primerjati dva JSON?

Primerjava dveh struktur JSON se redno pojavlja v življenju razvijalca. Odgovor API-ja ki se spremeni po posodobitvi. Konfiguracijska datoteka, ki se razlikuje med dvema okoljema. A izvoz predmetov, ki se morajo uskladiti z referenco. JSON diff se natančno odziva na to vprašanje: kaj je bilo dodano, izbrisano ali spremenjeno in kje?

diff vrstica za vrstico (a la git diff) pogosto ni dovolj. Če oblikovanje razlikuje (presledki, vrstni red tipk), besedilna razlika poroča o stotinah vrstic, medtem ko struktura podatki so enaki. Primerjalnik JSON deluje na strukturi, ko je enkrat razčlenjena, kar to odpravi šum in razkriva samo pomenske razlike.

Oblika razlike, ki jo ustvari orodje

Za vsako odstopanje orodje vrne:

  • pot v poenostavljenem formatu JSONPath, na primer $.user.address[0].city;
  • ena vrsta med dodanimi (dodanimi na desni), odstranjenimi (prisotni na levi samo), spremenjen (različne vrednosti);
  • leva vrednost in/ali desna vrednost, odvisno od vrste.

Prazen diff pomeni, da sta oba JSON-a strukturno enaka, ne glede na njun formatiranje ali vrstni red ključev.

Kako algoritem prečka obe strukturi

Algoritem je rekurziven. Na vsaki ravni identificira vrsto dveh primerjanih vrednosti:

  • Če sta oba asociativna objekta, je potrebna unija ključev. Za vsak ključ, se rekurzivno spušča ali označi kot dodan/odstranjen, če ključ obstaja samo na eni strani.
  • Če sta oba urejena niza, primerja položaj za položajem. A razlika na začetku tabele lahko premakne vse ostalo, kar proizvede besedno diff: to je a predpostavljena meja naivne strukturne razlike.
  • Če se vrste razlikujejo (objekt v primerjavi z matriko, skalar v primerjavi z ničelno), je označeno spremenjeno.
  • Če sta obe vrednosti skalarja (niz, število, logična vrednost, nič), preprost dovolj je stroga primerjava.

Vrstni red ključev v objektu ni pomemben: {"a": 1, "b": 2} in {"b": 2, "a": 1} ustvari prazen razl. To je v skladu s semantiko JSON, kjer vrstni red ni pomemben. notri Vendar je vrstni red elementov matrike pomemben: matrika je urejena s konstrukcijo.

Konkreten primer

Tu sta dve različici uporabniškega objekta:

// levo
{
  "id": 42,
  "ime": "Alice",
  "vloge": ["admin", "urednik"]
}

// prav
{
  "id": 42,
  "ime": "Alice Martin",
  "vloge": ["admin", "gledalec"],
  "aktivno": res
}

Razlika povzroči:

  • $.name: spremenjeno, "Alice""Alice Martin"
  • $.roles[1]: spremenjeno, "urejevalnik""pregledovalnik"
  • $.active: dodano, true

Primeri uporabe

  • Različna okolja: primerjajte izhod končne točke v predprodukciji in v proizvodnja. Zelo uporabno med selitvijo ali osveževanjem predpomnilnika.
  • Revizija selitve: primerjajte izvoz pred in po transformaciji, da preverite da nobeno polje ni izgubljeno.
  • Regresija API: pred in po spremembi primerjajte odziv za a enaka poizvedba. Prazen diff potrjuje nenazadovanje.
  • Sinhronizacija konfiguracije: primerjajte composer.json med dvema veje, dve datoteki .eslintrc, dve konfiguraciji Symfony.
  • Preizkusi posnetkov: zamenjajte primerjavo med vrsticami s primerjavo strukturno v paketu integracijskih testov.

Meje strukturne razlike

Primerjava urejenih nizov je znana omejitev naivnih strukturnih razlik. Če vstavimo a element na začetku matrike, so vsi naslednji položaji premaknjeni in diff signalizira vsako odstopanje kot sprememba. Za takšne primere obstajajo naprednejši algoritmi (Myers, Patience, diff po naravnem ključu), vendar presegajo obseg splošnega primerjalnega orodja.

Diff tudi ne pove, zakaj je prišlo do spremembe: to je opazovanje. Za analizo a regresije, se mora to opazovanje navzkrižno sklicevati z odobritvami, razmestitvami in parametri poizvedbo.

JSON diff proti JSON Patch (RFC 6902)

Komplementarna oblika je popravek JSON (RFC 6902). Opisuje v obliki operacij (dodaj, odstrani, zamenjaj, premakni, kopiraj, test), kako preoblikovati en dokument JSON v drugega. Pri čemer je naša razlika opazovanje (človek), popravek JSON je recept (stroj). Obe predstavitvi sta enakovredni za preprostih primerih, popravek JSON pa je uporaben za API-je RESTful, ki sprejemajo spremembe delno.

Pogosta vprašanja

Ali je razlika odvisna od vrstnega reda ključev?

Ne: za objekt JSON vrstni red ni pomemben. Primerjalnik daje enak rezultat kot so ključi razvrščeni ali ne.

Kako ravnati s tabelami, katerih vrstni red ni pomemben?

Orodje obravnava nize kot privzeto urejene (to je semantika JSON). Če zdravite nizov, razvrstite dve matriki po naravnem ključu pred primerjavo ali uporabite storitev specializirano primerjalno orodje, ki upošteva to semantiko.

Kakšna je razlika z Git diff?

Git primerja vrstice besedila. Če se zamik ali vrstni red ključev razlikuje, je Git diff zelo verbose. Razlika JSON deluje na razčlenjeni strukturi in poroča samo o vrzeli v podatkih.

Ali je sprejet neveljaven JSON?

Ne: če eden od obeh JSON-ov ne razčleni, orodje vrne napako. Najprej preverite pri našem JSON validator.

Primer zahteve

curl -X POST https://cdrn.fr/api/v1/tools/json-diff/execute \
  -H "Content-Type: application/json" \
  -d '{"left":"...","right":"..."}'

Vhodna shema

Polje Tip Obvezno Privzeto
left text
right text

Končne točke

  • GET https://cdrn.fr/api/v1/tools - izpiše vsa razpoložljiva orodja
  • GET https://cdrn.fr/api/v1/tools/json-diff - pridobi shemo tega orodja
  • POST https://cdrn.fr/api/v1/tools/json-diff/execute - izvede to orodje s JSON payloadom