Porovnajte dva objekty JSON s Gson

1. Prehľad

JSON je reťazcová reprezentácia údajov. Možno budeme chcieť tieto údaje porovnať v našich algoritmoch alebo testoch. A hoci je možné porovnávať reťazce obsahujúce JSON, porovnanie reťazcov je citlivé na rozdiely v zastúpení, skôr ako obsah.

Aby sme to prekonali a sémanticky porovnali údaje JSON, musíme načítať údaje do štruktúry v pamäti, ktorá nie je ovplyvnená vecami ako bielymi znakmi alebo poradím kľúčov objektu.

V tomto krátkom tutoriáli to vyriešime pomocou Gson, knižnice serializácie \ deserializácie JSON, ktorá umožňuje hĺbkové porovnanie medzi objektmi JSON.

2. Sémanticky identický JSON v rôznych reťazcoch

Pozrime sa bližšie na problém, ktorý sa snažíme vyriešiť.

Predpokladajme, že máme dva reťazce predstavujúce rovnaké údaje JSON, ale jeden z nich má na konci nejaké medzery navyše:

Reťazec string1 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}"; Reťazec string2 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}";

Aj keď je obsah objektov JSON rovnaký, porovnanie vyššie uvedeného ako reťazcov ukáže rozdiel:

assertNotEquals (string1, string2);

To isté by sa stalo, keby sa poradie kľúčov v objekte menilo, aj keď na to JSON zvyčajne nie je citlivý:

Reťazec string1 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}"; Reťazec string2 = "{\" age \ ": 27, \" fullName \ ": \" Emily Jenkins \ "}"; assertNotEquals (string1, string2);

Preto je výhodou, keby sme na porovnanie údajov JSON použili knižnicu na spracovanie JSON.

3. Maven závislosť

Ak chcete používať Gson, najskôr pridajme závislosť Gson Maven:

 com.google.code.gson gson 2.8.6 

4. Analýza JSON do objektov Gson

Predtým, ako sa ponoríme do porovnávania objektov, pozrime sa, ako Gson predstavuje údaje JSON v Jave.

Pri práci s formátom JSON v prostredí Java je najskôr potrebné konvertovať reťazec JSON na objekt Java. Gson poskytuje JsonParser ktorý analyzuje zdrojový JSON na a JsonElement strom:

Analyzátor JsonParser = nový JsonParser (); String objectString = "{\" customer \ ": {\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}}"; String arrayString = "[10, 20, 30]"; JsonElement json1 = parser.parse (objectString); JsonElement json2 = parser.parse (arrayString);

JsonElement je abstraktná trieda predstavujúca prvok JSON. The analyzovať metóda vracia implementáciu JsonElement; buď a JsonObject, JsonArray, JsonPrimitive alebo JsonNull:

assertTrue (json1.isJsonObject ()); assertTrue (json2.isJsonArray ());

Každá z týchto podtried (JsonObject, JsonArray, atď.) prepíše Object.equals metóda poskytujúca efektívne hĺbkové porovnanie JSON.

5. Prípady použitia porovnania Gson

5.1. Porovnajte dva jednoduché objekty JSON

Predpokladajme, že máme dva reťazce predstavujúce jednoduché objekty JSON, kde je poradie kľúčov odlišné:

Prvý objekt má celé meno skôr než Vek:

{"customer": {"id": 44521, "fullName": "Emily Jenkins", "age": 27}}

Druhá obráti poradie:

{"customer": {"id": 44521, "age": 27, "fullName": "Emily Jenkins"}}

Môžeme ich jednoducho analyzovať a porovnať:

assertEquals (parser.parse (string1), parser.parse (string2));

V takom prípade JsonParser vracia a JsonObject, ktorého rovná sa implementácia nie jecitlivé na objednávku.

5.2. Porovnajte dva polia JSON

V prípade polí JSON, JsonParser vráti a JsonArray.

Ak máme jedno pole v jednom poradí:

[10, 20, 30]
assertTrue (parser.parse (string1) .isJsonArray ());

Môžeme to porovnať s iným v inom poradí:

[20, 10, 30]

Na rozdiel od JsonObject, JsonArray‘S rovná sa metóda je citlivá na objednávku, takže tieto polia nie sú rovnaké, čo je sémanticky správne:

assertNotEquals (parser.parse (string1), parser.parse (string2));

5.3. Porovnajte dva vnorené objekty JSON

Ako sme videli skôr, JsonParser môže analyzovať stromovú štruktúru JSON. Každý JsonObject a JsonArray obsahovať ďalšie JsonElement predmety, ktoré môžu byť samy osebe JsonObject alebo JsonArray.

Keď použijeme rovná sa, rekurzívne porovnáva všetkých členov, čo znamená vnorené objekty sú tiež porovnateľné:

Ak je to tak reťazec1:

{"customer": {"id": "44521", "fullName": "Emily Jenkins", "age": 27, "consumer_info": {"fav_product": "Coke", "last_buy": "2012-04 -23 "}}}

A tento JSON je string2:

{"customer": {"fullName": "Emily Jenkins", "id": "44521", "age": 27, "consumer_info": {"last_buy": "2012-04-23", "fav_product": "Koks" } } }

Potom môžeme ešte použiť rovná sa spôsob ich porovnania:

assertEquals (parser.parse (string1), parser.parse (string2));

6. Záver

V tomto krátkom článku sme sa zaoberali výzvami porovnávania JSON ako a String. Videli sme, ako nám Gson umožňuje analyzovať tieto reťazce do objektovej štruktúry, ktorá podporuje porovnanie.

Zdrojový kód vyššie uvedených príkladov nájdete ako vždy na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found