Két JSON-objektum összehasonlítása a Gsonnal

1. Áttekintés

A JSON az adatok karakterlánc-reprezentációja. Érdemes összehasonlítani ezeket az adatokat algoritmusainkban vagy tesztjeinkben. És bár lehetséges összehasonlítani a JSON-ot tartalmazó karakterláncokat, a húr összehasonlítás érzékeny az ábrázolás különbségeire, nem pedig tartalom.

Ennek leküzdése és a JSON-adatok szemantikai összehasonlítása érdekében be kell töltenünk az adatokat a memória olyan struktúrájába, amelyet nem érintenek például a szóköz vagy az objektum kulcsainak sorrendje.

Ebben a rövid bemutatóban ezt a Gson segítségével oldjuk meg, egy JSON serialization \ deserialization könyvtár segítségével, amely mély összehasonlítást tud végezni a JSON objektumok között.

2. Szemantikailag azonos JSON különböző húrokban

Vizsgáljuk meg közelebbről azt a problémát, amelyet megpróbálunk megoldani.

Tegyük fel, hogy két karakterláncunk van, ugyanazokat a JSON-adatokat ábrázolva, de az egyiknek van néhány extra szóköz a végén:

String string1 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}"; String string2 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}";

Bár a JSON objektumok tartalma egyenlő, a fentiek összehasonlítása stringként különbséget fog mutatni:

assertNotEquals (string1, string2);

Ugyanez történne, ha az objektumok kulcsainak sorrendje változna, bár a JSON általában nem érzékeny erre:

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

Éppen ezért előnyös lenne, ha JSON-feldolgozó könyvtárat használunk a JSON-adatok összehasonlításához.

3. Maven-függőség

A Gson használatához először tegyük hozzá a Gson Maven függőséget:

 com.google.code.gson gson 2.8.6 

4. A JSON elemzése Gson objektumokká

Mielőtt elmélyülnénk az objektumok összehasonlításában, nézzük meg, hogy a Gson hogyan ábrázolja a JSON adatokat a Java-ban.

Amikor JSON-nal dolgozunk Java-ban, először át kell alakítanunk a JSON-karakterláncot Java-objektummá. Gson biztosítja JsonParser amely a JSON forrást elemzi a JsonElement fa:

JsonParser elemző = új 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 egy absztrakt osztály, amely a JSON egyik elemét képviseli. A elemzés metódus adja vissza a JsonElement; vagy a JsonObject, JsonArray, JsonPrimitive vagy JsonNull:

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

Ezen alosztályok mindegyike (JsonObject, JsonArray, stb.) felülírja a Tárgy.egyenlő módszer, amely hatékony mély JSON összehasonlítást nyújt.

5. Gson összehasonlító használati esetek

5.1. Két egyszerű JSON-objektum összehasonlítása

Tegyük fel, hogy két karakterláncunk van, amelyek egyszerű JSON objektumokat képviselnek, ahol a kulcsok sorrendje eltérő:

Az első objektumnak van teljes név korábban mint kor:

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

A második megfordítja a sorrendet:

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

Egyszerűen elemezhetjük és összehasonlíthatjuk őket:

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

Ebben az esetben a JsonParser visszatér a JsonObject, akinek egyenlő a megvalósítás nemrend-érzékeny.

5.2. Hasonlítson össze két JSON tömböt

JSON tömbök esetén JsonParser visszaadja a JsonArray.

Ha egy tömb van egy sorrendben:

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

Más sorrendben összehasonlíthatjuk:

[20, 10, 30]

nem úgy mint JsonObject, JsonArray’S egyenlő módszer sorrend-érzékeny, tehát ezek a tömbök nem egyenlőek, ami szemantikailag helyes:

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

5.3. Két beágyazott JSON-objektum összehasonlítása

Ahogy korábban láttuk, JsonParser elemezni tudja a JSON faszerű szerkezetét. Minden egyes JsonObject és JsonArray egyéb JsonElement tárgyak, amelyek önmagukban is típusúak lehetnek JsonObject vagy JsonArray.

Amikor használjuk egyenlő, az összes tagot rekurzív módon hasonlítja össze, ami azt jelenti a beágyazott objektumok is összehasonlíthatók:

Ha ez van string1:

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

És ez a JSON az string2:

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

Akkor még használhatjuk a egyenlő módszer ezek összehasonlítására:

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

6. Következtetés

Ebben a rövid cikkben megvizsgáltuk a JSON mint a Húr. Láttuk, hogy a Gson lehetővé teszi számunkra, hogy ezeket a karakterláncokat objektumszerkezetként elemezzük, amely támogatja az összehasonlítást.

Mint mindig, a fenti példák forráskódja megtalálható a GitHub oldalon.


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