Déan comparáid idir dhá struchtúr JSON

déanann sé comparáid idir dhá struchtúr JSON agus liostaíonn sé na breiseanna, scriosanna agus athruithe, eochair ar eochair

Cén fáth comparáid a dhéanamh idir dhá JSON?

Nuair a dhéantar comparáid idir dhá struchtúr JSON tagann aníos go rialta i saol an fhorbróra. Freagra API a athraíonn tar éis nuashonrú. Comhad cumraíochta a athraíonn idir dhá thimpeallacht. A onnmhairiú rudaí nach mór a ailíniú le tagairt. Freagraíonn JSON diff go beacht dó an cheist seo: cad a cuireadh leis, a scriosadh nó a athraíodh, agus cén áit?

Is minic nach leor líne ar líne diff (a la git diff). Má tá an formáidiú difriúil (spásanna, eochair-ord), tuairiscíonn an difr téacsúil na céadta línte agus an struchtúr sonraí comhionann. Oibríonn comparadóir JSON ar an struchtúr nuair a bheidh sé parsáilte, rud a chuireann deireadh leis seo torann agus ní nochtann sé ach difríochtaí shéimeantacha.

Formáid an difr a tháirgeann an uirlis

I gcás gach diall, filleann an uirlis:

  • a conair i bhformáid JSONPath simplithe, mar shampla $.user.address[0].city;
  • ceann cineál i measc curtha leis (curtha leis ar dheis), bhainte (i láthair ar chlé amháin), athraithe (luachanna éagsúla);
  • an luach ar chlé agus/nó an luach ceart ag brath ar an gcineál.

Ciallaíonn difr folamh go bhfuil an dá JSON comhionann ó thaobh struchtúir de, beag beann ar a gcuid formáidiú nó eochair-ordú.

Conas a thrasnaíonn an t-algartam an dá struchtúr

Tá an algartam athchúrsach. Ag gach leibhéal, sainaithníonn sé cineál an dá luach a chuirtear i gcomparáid:

  • Más réada comhlacha an dá cheann, caithfidh sé aontú na n-eochracha. I gcás gach eochair, íslíonn sé arís agus arís eile, nó marcálann sé curtha leis/bainte mura bhfuil an eochair ach ar thaobh amháin.
  • Más eagair ordaithe iad an dá cheann, déanann sé comparáid idir ionad agus suíomh. A Is féidir difríocht ag tús an tábla a athrú gach rud eile, a tháirgeann verbose diff: tá sé a teorainn leis an difríocht struchtúrach naive.
  • Má bhíonn difríocht idir na cineálacha (réad versus eagar, scálach versus null), marcáiltear é athraithe.
  • Más scálaí an dá luach (teaghrán, uimhir, Boole, null), rud simplí is leor comparáid dhian.

Ní hionann ord na n-eochracha i réad: {"a": 1, "b": 2} agus {"b": 2, "a": 1} difr folamh a tháirgeadh. Cloíonn sé seo le semantics JSON, áit nach bhfuil ciall leis an ord. I Mar sin féin, tá tábhacht ag baint le hord na n-eilimintí d'eagar: ordaítear eagar de réir tógála.

Sampla nithiúil

Seo dhá leagan de réad úsáideora:

// fágtha
{
  "id": 42,
  "name": "Alice",
  "róil": ["riarachán", "eagarthóir"]
}

// ceart
{
  "id": 42,
  "name": "Alice Martin",
  "róil": ["riarachán", "amharcóir"],
  "gníomhach": fíor
}

Táirgeann an difríocht:

  • $.name: athraithe, "Alice""Alice Martin"
  • $.roles[1]: athraithe, "eagarthóir""amharcóir"
  • $.active: curtha leis, fíor

Cásanna úsáide

  • Timpeallacht dhifriúla: déan comparáid idir aschur críochphointe sa réamhtháirgeadh agus i táirgeadh. An-úsáideach le linn aistrithe nó athnuachan taisce.
  • Iniúchadh imirce: déan comparáid idir onnmhairiú roimh agus tar éis claochlaithe le seiceáil nár cailleadh aon réimse.
  • Aischéimniú API: roimh agus tar éis athrú, déan comparáid idir an freagra do a ceist chomhionann. Deimhníonn difr folamh neamh-aischéimniú.
  • Sioncronú cumraíochta: déan comparáid idir composer.json idir dhá cheann brainsí, dhá chomhad .eslintrc, dhá chumraíocht Symfony.
  • Tástálacha seat: cuir comparáid in ionad comparáid líne le líne struchtúrach i sraith tástála comhtháthaithe.

Teorainneacha na difríochta struchtúracha

Is ionann comparáid a dhéanamh idir eagair ordaithe agus teorannú ar dhifríochtaí struchtúracha naive. Má chuirimid isteach a eilimint ag tús an eagar, aistrítear gach suíomh ina dhiaidh sin agus comharthaíonn an difr gach diall mar mhodhnú. I gcásanna den sórt sin, tá algartaim níos forbartha ann (Myers, Patience, diff le heochair nádúrtha), ach téann siad thar raon feidhme uirlis ghinearálta chomparáide.

Ní deir an difr freisin cén fáth ar tharla athrú: is breathnóireacht é. Chun anailís a aischéimniú, ní mór an bhreathnóireacht seo a chrostagairt le gealltanais, imscaradh agus paraiméadair an ceist.

JSON diff vs JSON Patch (RFC 6902)

Is formáid chomhlántach é Paiste JSON (RFC 6902). Déanann sé cur síos, i bhfoirm oibríochtaí (cuir, bain, ionadaigh, bog, copy, test), conas doiciméad JSON amháin a thiontú go doiciméad eile. Áit a bhfuil ár ndifríocht ina breathnú (duine), is oideas (meaisín) é JSON Patch. Is ionann an dá léiriú do cásanna simplí, agus tá JSON Patch úsáideach le haghaidh APIs RESTful a ghlacann le modhnuithe páirteach.

Ceisteanna coitianta

An bhfuil an difríocht ag brath ar an ord eochrach?

Níl: i gcás réad JSON, níl an t-ordú suntasach. Táirgeann an comparadóir an toradh céanna le na heochracha curtha in eagar nó nach bhfuil.

Conas táblaí a láimhseáil nach bhfuil a n-ord tábhachtach?

Measann an uirlis eagair mar a ordaítear de réir réamhshocraithe (is é seo JSON semantics). Má dhéileálann tú tacair, sórtáil an dá eagar de réir eochair nádúrtha roimh chomparáid a dhéanamh, nó úsáid seirbhís uirlis speisialaithe chomparáide a chuireann na séimeantaice seo san áireamh.

Cad é an difríocht le Git difr?

Déanann Git línte téacs a chur i gcomparáid. Má bhíonn difríocht idir an eangú nó an t-ord eochrach, tá an difr Git an- briathra. Oibríonn an difr JSON ar an struchtúr parsáilte agus ní thuairiscíonn sé ach bearnaí sonraí.

An bhfuil glacadh le JSON neamhbhailí?

Ní dhéanfaidh: mura ndéanann ceann amháin den dá JSON parsáil, filleann an uirlis earráid. Bailíochtaigh ar dtús lenár bailíochtóir JSON.

Sampla iarratais

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

Scéimre ionchuir

Réimse Cineál Riachtanach Réamhshocrú
left text
right text

Críochphointí

  • GET https://cdrn.fr/api/v1/tools - liostaíonn na huirlisí go léir atá ar fáil
  • GET https://cdrn.fr/api/v1/tools/json-diff - faigh scéimre na huirlise seo
  • POST https://cdrn.fr/api/v1/tools/json-diff/execute - rith an uirlis seo le pálasta JSON