Qabbel żewġ strutturi JSON

iqabbel żewġ strutturi JSON u jelenka l-żidiet, tneħħijiet u tibdil, ċavetta b'ċavetta

Għaliex tqabbel żewġ JSON?

It-tqabbil ta 'żewġ strutturi JSON joħroġ regolarment fil-ħajja ta' żviluppatur. Risposta API li tinbidel wara aġġornament. Fajl ta' konfigurazzjoni li jvarja bejn żewġ ambjenti. A esportazzjoni ta' oġġetti li jridu jallinjaw ma' referenza. AJSON difftwieġeb preċiżament din il-mistoqsija: x'kien miżjud, imħassra jew modifikat, u fejn?

diff linja b'linja (a la git diff) spiss ma jkunx biżżejjed. Jekk l-ifformattjar differenti (spazji, ordni ewlenin), id-diff testwali tirrapporta mijiet ta 'linji filwaqt li l-istruttura data hija identika. Komparatur JSON jaħdem fuq l-istruttura darba parsed, li jelimina dan storbju u jiżvela biss differenzi semantiċi.

Il-format tad-diff prodott mill-għodda

Għal kull devjazzjoni, l-għodda tirritorna:

  • mogħdija f'format JSONPath simplifikat, pereżempju $.user.address[0].city;
  • tip wieħed fostmiżjud (miżjud fuq il-lemin), imneħħi (preżenti fuq ix-xellug biss), modifikati (valuri differenti);
  • il-valur tax-xellug u/jew il-valur it-tajjeb skont it-tip.

Diff vojt ifisser li ż-żewġ JSONs huma strutturalment identiċi, irrispettivament minn tagħhom ifformattjar jew ordni taċ-ċavetta.

Kif l-algoritmu jaqsam iż-żewġ strutturi

L-algoritmu huwa rikorsiv. F'kull livell, tidentifika t-tip taż-żewġ valuri mqabbla:

  • Jekk it-tnejn huma oġġetti assoċjattivi, tieħu l-unjoni taċ-ċwievet. Għal kull ċavetta, tinżel b'mod rikorsiv, jew timmarka miżjuda/tneħħija jekk iċ-ċavetta teżisti biss fuq naħa waħda.
  • Jekk it-tnejn huma arrays ordnati, iqabbel pożizzjoni b'pożizzjoni. A differenza fil-bidu tat-tabella tista 'taqleb kull ħaġa oħra, li tipproduċi diff verbose: huwa a limitu preżunt tad-differenza strutturali naive.
  • Jekk it-tipi jvarjaw (oġġett kontra firxa, skalar kontra null), ikun immarkat modifikat.
  • Jekk iż-żewġ valuri huma skalari (sekwenza, numru, boolean, null), sempliċi paragun strett huwa biżżejjed.

L-ordni taċ-ċwievet f'oġġett ma jimpurtax: {"a": 1, "b": 2} u {"b": 2, "a": 1} tipproduċi diff vojta. Dan jikkonforma mas-semantika JSON, fejn l-ordni mhix sinifikanti. Fil Madankollu, l-ordni ta 'l-elementi ta' firxa hija importanti: firxa hija ordnata mill-kostruzzjoni.

Eżempju konkret

Hawn żewġ verżjonijiet ta' oġġett tal-utent:

// xellug
{
  "id": 42,
  "isem": "Alice",
  "rwoli": ["admin", "editur"]
}

// dritt
{
  "id": 42,
  "isem": "Alice Martin",
  "rwoli": ["admin", "telespettatur"],
  "attiv": veru
}

Id-differenza tipproduċi:

  • $.name: modifikat, "Alice""Alice Martin"
  • $.roles[1]: modifikat, "editur""viewer"
  • $.active: miżjud, veru

Każijiet ta' użu

  • Ambjenti differenti: qabbel l-output ta’ endpoint fil-preproduzzjoni u fil- produzzjoni. Utli ħafna waqt migrazzjoni jew aġġornament tal-cache.
  • Verifika tal-migrazzjoni: qabbel esportazzjoni qabel u wara t-trasformazzjoni biex tiċċekkja li l-ebda għelieqi ma ntilfu.
  • Rgressjoni API: qabel u wara bidla, qabbel ir-rispons għal a mistoqsija identika. Diff vojt jikkonferma li ma jkunx hemm rigressjoni.
  • Sinkronizzazzjoni tal-konfigurazzjoni: qabbel composer.json bejn tnejn fergħat, żewġ fajls .eslintrc, żewġ konfigurazzjonijiet Symfony.
  • Testijiet ta' snapshot: ibdel paragun minn linja għal linja ma' paragun strutturali f'suite ta' test ta' integrazzjoni.

Limiti ta' differenza strutturali

It-tqabbil ta 'arrays ordnati huwa limitazzjoni magħrufa ta' diffs strutturali naive. Jekk indaħħlu a element fil-bidu tal-firxa, il-pożizzjonijiet sussegwenti kollha huma mċaqalqa u d-diff sinjal kull devjazzjoni bħala modifika. Għal każijiet bħal dawn, jeżistu algoritmi aktar avvanzati (Myers, Patience, diff b'ċavetta naturali), iżda jmorru lil hinn mill-ambitu ta 'għodda ġenerali ta' tqabbil.

Id-diff ukoll ma jgħidx għaliex seħħet bidla: hija osservazzjoni. Biex tanalizza a rigressjoni, din l-osservazzjoni għandha tkun inkroreferita mal-impenji, l-iskjeramenti u l-parametri tal- mistoqsija.

Diff JSON vs Garża JSON (RFC 6902)

Format kumplimentari huwa JSON Garża (RFC 6902). Jiddeskrivi, fil-forma ta 'operazzjonijiet (żid, neħħi, ibdel, ċaqlaq, kopja, test), kif tittrasforma dokument JSON wieħed f'ieħor. Fejn id-differenza tagħna hija osservazzjoni (uman), JSON Garża hija riċetta (magna). Iż-żewġ rappreżentazzjonijiet huma ekwivalenti għal każijiet sempliċi, u JSON Patch huwa utli għal RESTful APIs li jaċċettaw modifiki parzjali.

Mistoqsijiet frekwenti

Id-differenza tiddependi fuq l-ordni taċ-ċavetta?

Le: għal oġġett JSON, l-ordni mhix sinifikanti. Il-komparatur jipproduċi l-istess riżultat bħal iċ-ċwievet huma magħżula jew le.

Kif timmaniġġja tabelli li l-ordni tagħhom mhix importanti?

L-għodda tqis arrays bħala ordnati awtomatikament (din hija semantika JSON). Jekk tikkura settijiet, issortja ż-żewġ matriċi b'ċavetta naturali qabel ma tqabbel, jew uża servizz għodda speċjalizzata ta’ tqabbil li tqis din is-semantika.

X'inhi d-differenza ma' Git diff?

Git tqabbel linji ta 'test. Jekk l-indentazzjoni jew l-ordni taċ-ċavetta tvarja, id-diff tal-Git huwa ħafna verbose. Id-diff JSON jaħdem fuq l-istruttura parsed u jirrapporta biss il-lakuni fid-dejta.

JSON invalidu huwa aċċettat?

Le: jekk wieħed miż-żewġ JSONs ma parse, l-għodda tirritorna żball. Ivvalida l-ewwel ma tagħna Validatur JSON.

Eżempju ta' talba

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

Skema ta' input

Kamp Tip Meħtieġ Default
left text
right text

Endpoints

  • GET https://cdrn.fr/api/v1/tools - telenka l-għodod kollha disponibbli
  • GET https://cdrn.fr/api/v1/tools/json-diff - tikseb l-iskema ta' din l-għodda
  • POST https://cdrn.fr/api/v1/tools/json-diff/execute - teżegwixxi din l-għodda b'payload JSON