Két JSON-szöveg eltérhet úgy, hogy ugyanazokat az adatokat tartalmazza. A behúzás, a sortörés és az objektum mezőinek sorrendje önmagában kevés egy tartalmi változás kimondásához. A tömbök sorrendje, a mezők adattípusa és a hiányzó értékek viszont érdemi különbséget jelenthetnek.
Először azt ellenőrizd, érvényes-e a bemenet
A JSON formázó és ellenőrző alkalmas arra, hogy az összehasonlítás előtt átnézd a két adatszerkezetet. A JSON mezőneveit és szöveges értékeit dupla idézőjel határolja. Egy kimaradt idézőjel vagy egy fölösleges vessző miatt az egész beolvasás meghiúsulhat.
Az RFC 8259 az objektumot név–érték párok rendezetlen gyűjteményeként, a tömböt rendezett sorozatként határozza meg. A szöveg és a szám külön adattípus. Ezek a különbségek adják az összehasonlítás alapját; a konkrét program viselkedését pedig a saját összehasonlítási szabálya teszi egyértelművé.
A DG JSON-összehasonlító kulcsútvonalak szerint mutatja az eltéréseket. Az objektumkulcsok sorrendjét figyelmen kívül hagyja, a tömbelemeket az indexük alapján veti össze.
Ugyanaz a rendelési tétel két állapotban
Szemléltető példánkban egy tétel két változatát vizsgáljuk. A cikkszám szövegként tárolt azonosító, az egységár és a darabszám számszerű adat. A megadott árak kizárólag a számítás példaszámai.
| Mező | Első állapot | Második állapot |
|---|---|---|
| cikkszam | „0017” | „0017” |
| egysegar | 19 200 | 19 350 |
| darab | 3 | 2 |
Két mező értéke módosult. A cikkszám változatlan, akkor is, ha a második állapotban a dokumentum végére került. Az egységár változása 19 350 − 19 200 = 150, a darabszám változása 2 − 3 = −1.
A tételösszeget külön számítással ellenőrizzük: az első állapotban 19 200 × 3 = 57 600, a másodikban 19 350 × 2 = 38 700. Az eltérés −18 900. Az összehasonlító a mezőváltozásokat mutatja; egy üzleti rendszerben az összegre gyakorolt hatást a megfelelő számítási szabállyal kell értelmezned.
A listák felcserélése több eltérést okozhat
Képzelj el három színt tartalmazó listát: piros, zöld, kék. A második változatban kék, zöld, piros a sorrend. Index szerinti összevetésnél az első és a harmadik hely változik: háromból két pozíció, vagyis 66,67%.
A színek halmaza közben ugyanaz maradt. Ez hasznos különbségtétel: egy rangsorban a sorrend a jelentés része, egy címkelistánál viszont az alkalmazás szabálya döntheti el, számít-e. Ne rendezd át automatikusan az összes tömböt az összehasonlítás előtt. Előbb azonosítsd, mely listáknál szabad elengedni a sorrendet.
Rendelési sorok párosítása azonosító alapján
Tegyük fel, hogy az első listában az A001 tétel 3 darabbal, utána a B009 tétel 1 darabbal áll. A második listában B009 kerül előre 1 darabbal, majd A001 következik 2 darabbal. Az indexenkénti összehasonlítás mindkét sorban eltéréseket mutat, mert más tétel került ugyanarra a helyre.
Ha az üzleti kérdés a tételek változása, előbb az egyedi tételazonosító szerint párosíts:
| Tételazonosító | Korábbi darabszám | Új darabszám | Tartalmi változás |
|---|---|---|---|
| A001 | 3 | 2 | −1 darab |
| B009 | 1 | 1 | Változatlan |
Ez külön előkészítési lépés, a DG összehasonlító továbbra is a tömbindexeket vizsgálja. Azonosító szerinti párosítás előtt mindkét listában ellenőrizd az azonosítók egyediségét. Két azonos A001 sor esetén már üzleti szabály kell ahhoz, hogy összevonhatók-e vagy hibás az export. Rangsor, feldolgozási sorrend vagy műveleti napló esetén a sorrend maga is adat; ott az automatikus rendezés valódi változást rejthet el.
Az egy objektumon belül ismételt mezőnév másik probléma. Az RFC 8259 egyedi neveket ajánl: ismétlődésnél egyes feldolgozók az utolsó értéket tartják meg, mások hibát adnak. A DG összehasonlító a JavaScript beolvasóját használja, ezért a {"darab":2,"darab":3} és a {"darab":3} bemenetet a feldolgozás után azonosnak mutatja. A korábbi 2 érték ekkor már nem része a beolvasott objektumnak.
Egy ilyen export jóváhagyásához az eredeti JSON-szövegben kell kiszűrnöd az ismételt neveket. A sikeres formázás és az „azonos” összehasonlítás erre nem ad bizonyítékot. Az adatot előállító folyamatot javítsd, és az eredeti fájlt őrizd meg a hibakereséshez; az utólag újramentett JSON-ból a korábbi ismétlődés már eltűnhet.
Szám, szöveg, hiány és üres érték
A 17 szám és a „0017” szöveg más adat. Az azonosítóként használt kezdő nullák csak a szöveges alakban őrizhetők meg egyértelműen. A hiányzó mező és a null értékkel jelen lévő mező között is van szerkezeti eltérés. Az üres szöveg ismét külön eset: a mező létezik, és egy nulla hosszúságú szöveget tartalmaz.
Nagyon hosszú számsoroknál a beolvasó számábrázolása is számít. Az RFC 8259 a széles körben használt bináris lebegőpontos megoldásoknál a 2⁵³ − 1 = 9 007 199 254 740 991 határig emeli ki az egész számok pontos együttműködését. Hosszú azonosítót ezért az adatküldő és adatfogadó szerződése szerint, megfelelő szöveges formában érdemes átadni.
Tizedes számoknál a kerekítés rendjét is hasonlítsd össze
Bináris lebegőpontos számítás után a 0,1 és a 0,2 összege például 0,30000000000000004 alakban jelenhet meg, miközben a másik exportban 0,3 áll. Az RFC 8259 megengedi, hogy a feldolgozók korlátozzák a számok pontosságát. Egy ilyen eltérés értelmezéséhez ismerned kell a mező jelentését.
Pénzösszegnél rögzítsd a pénznemet, a megengedett tizedesjegyeket és a kerekítés helyét. Saját szemléltető példában egy termék ára 199,995 EUR, a mennyiség 3. Ha a választott szabály szerint minden egységárat előbb két tizedesre, félértéknél felfelé kerekítesz, az összeg 200,00 × 3 = 600,00 EUR. Ha csak a sor végösszegét kerekíted ugyanezzel a szabállyal, 599,985 → 599,99 EUR. A különbség egy cent, és a műveletek sorrendjéből következik. Ez példaszabály, nem számlázási jogszabály ismertetése.
Egyeztetéskor a dokumentált kerekítési rendből számíts újra. Az összes kis különbség automatikus elengedése valós hibát is elrejthet. Azonosítóknál, darabszámoknál és állapotkódoknál egy pénzösszeghez választott tolerancia eleve más jelentést kapna.
Mielőtt jóváhagysz egy új exportot, válassz egy változatlan mezőt, egy módosult számot és egy átrendezett listát. Ez a három rövid ellenőrzés megmutatja, milyen eltérést jelez a választott eszköz, és hogyan kell olvasnod az eredményét.
Záró tudáspróba
Kérdésenként egy választ jelölj meg, majd a megoldások alapján pontozd magad. Ez a három kérdés a cikkben bemutatott összefüggéseket ellenőrzi.
1. Mi igaz a JSON-objektum kulcssorrendjére és a tömb elemsorrendjére a DG összehasonlításánál?
- A) Mindkét sorrend mindig külön értékváltozás.
- B) Az objektum kulcssorrendje nem számít, a tömböt indexenként hasonlítja.
- C) Egyik sorrend sem számít.
2. A bemenetben kétszer szerepel a darab kulcs, előbb 2-vel, majd 3-mal. A DG beolvasása után azonosnak látszik az egyszeri darab: 3 objektummal. Mit jelent ez?
- A) Bizonyítja, hogy az eredeti JSON-ban nem volt ismételt név.
- B) A két darabszám összeadódott 5-re.
- C) A JavaScript beolvasó az utolsó értéket tartotta meg; az eredeti duplikációt külön kell kiszűrni.
3. 199,995 EUR az egységár, 3 a darabszám. Két tizedesre, félnél felfelé kerekítünk. Mennyi az összeg egységáronkénti, illetve csak sorvégi kerekítéssel?
- A) 599,99 EUR, illetve 600,00 EUR.
- B) 600,00 EUR, illetve 599,99 EUR.
- C) Mindkettő pontosan 600,00 EUR.
Megoldások és pontozás
1. B. Az objektumban a mezőnév azonosítja az értéket, a tömbben az index. Üzleti tételazonosító szerinti párosítás külön előkészítési szabály lehet. Ismétléshez: Először azt ellenőrizd, érvényes-e a bemenet.
2. C. A beolvasott objektumban a korábbi érték már nincs jelen. A feldolgozás utáni egyezés nem igazolja az eredeti szöveg névegyediségét. Ismétléshez: Rendelési sorok párosítása azonosító alapján.
3. B. Előbb az egységárat kerekítve 200,00 × 3 = 600,00. A pontos szorzat 599,985, amely sorvégen 599,99-re kerekül. A választott sorrendet az adatszerződésben rögzíteni kell. Ismétléshez: Tizedes számoknál a kerekítés rendjét is hasonlítsd össze.
Minden helyes válasz 1 pont; a hibás vagy kihagyott válasz 0 pont. Az összpontszám 0–3 lehet.
- 0 pont: dolgozd végig újra a három megoldásban megjelölt részt, és írd le a példák kiinduló feltételeit.
- 1 pont: a két elhibázott kérdésnél vezesd le a helyes választ; külön írd mellé, melyik feltétel vagy számolási lépés maradt ki.
- 2 pont: térj vissza az egyetlen elhibázott kérdéshez kapcsolt részhez, majd egy bemenet megváltoztatásával ellenőrizd újra az eredményt.
- 3 pont: a három összefüggést ebben a feladatsorban helyesen alkalmaztad. Próbáld ki a cikk egyik ellenőrzését saját adatokkal, a feltételeket és a mértékegységeket is feljegyezve.