Hasonlítson össze két JSON-objektumot Jacksonnal
1. Áttekintés
Ebben a cikkben két JSON objektumot fogunk összehasonlítani Jackson - egy JSON Java-feldolgozó könyvtár használatával.
2. Maven-függőség
Először tegyük hozzá a jackson-databind Maven-függőség:
com.fasterxml.jackson.core jackson-databind 2.11.1
3. Jackson használata két JSON-objektum összehasonlításához
Használjuk a ObjectMapper osztály egy objektumot a-ként olvasni JsonNode.
Hozzunk létre egy ObjectMapper:
ObjectMapper mapper = új ObjectMapper ();
3.1. Két egyszerű JSON-objektum összehasonlítása
Kezdjük azzal, hogy JsonNode.egyenlő módszer. A egyenlő () módszer teljes (mély) összehasonlítást végez.
Tegyük fel, hogy van egy JSON karakterláncunk, amelyet a s1 változó:
{"alkalmazott": {"id": "1212", "fullName": "John Miles", "kor": 34}}
És szeretnénk összehasonlítani egy másik JSON-nal, s2:
{"alkalmazott": {"id": "1212", "életkor": 34, "fullName": "John Miles"}}
Olvassuk el a JSON bemenetet JsonNode és hasonlítsa össze:
assertEquals (mapper.readTree (s1), mapper.readTree (s2));
Fontos megjegyezni annak ellenére, hogy az input JSON változókban az attribútumok sorrendje s1 és s2 nem ugyanaz, a egyenlő () A módszer figyelmen kívül hagyja a sorrendet, és egyenlőnek tekinti őket.
3.2. Két JSON-objektum összehasonlítása beágyazott elemmel
Ezután megtudjuk, hogyan lehet összehasonlítani két beágyazott elemet tartalmazó JSON-objektumot.
Kezdjük egy JSON-val, amelyet a következőként definiálunk s1 változó:
{"alkalmazott": {"id": "1212", "fullName": "John Miles", "kor": 34, "contact": {"email": "[email protected]", "phone": " 9999999999 "}}}
Mint láthatjuk, a JSON beágyazott elemet tartalmaz kapcsolatba lépni. Összehasonlítani szeretnénk egy másik által definiált JSON-nal s2:
{"alkalmazott": {"id": "1212", "életkor": 34, "fullName": "John Miles", "contact": {"email": "[email protected]", "phone": " 9999999999 "}}}
Olvassuk el a JSON bemenetet JsonNode és hasonlítsa össze:
assertEquals (mapper.readTree (s1), mapper.readTree (s2));
Ismét észre kell vennünk ezt egyenlő () két bemeneti JSON objektumot is be lehet hasonlítani beágyazott elemekkel.
3.3. Hasonlítson össze két listaelemet tartalmazó JSON-objektumot
Hasonlóképpen összehasonlíthatunk két JSON-objektumot is, amelyek tartalmaznak egy listaelemet.
Tekintsük ezt a JSON-t definiáltnak s1:
{"alkalmazott": {"id": "1212", "fullName": "John Miles", "kor": 34, "készségek": ["Java", "C ++", "Python"]}}
Összehasonlítjuk egy másik JSON-nal s2:
{"alkalmazott": {"id": "1212", "kor": 34, "fullName": "John Miles", "készségek": ["Java", "C ++", "Python"]}}
Olvassuk el a JSON bemenetet JsonNode és hasonlítsa össze:
assertEquals (mapper.readTree (s1), mapper.readTree (s2));
Fontos ezt tudni két listaelemet csak akkor hasonlítunk egyenlőnek, ha ugyanazon értékek vannak pontosan ugyanabban a sorrendben.
4. Hasonlítsa össze a két JSON-objektumot az egyéni összehasonlítóval
JsonNode.egyenlő az esetek többségében elég jól működik. Jackson azt is biztosítja JsonNode.equals (összehasonlító, JsonNode) egyéni Java C konfigurálásáhozösszehasonlító tárgy. Értsük meg, hogyan kell használni a szokásokat Összehasonlító.
4.1. Egyéni összehasonlító a numerikus értékek összehasonlításához
Értsük meg, hogyan kell használni a szokásokat Összehasonlító két numerikus értékű JSON elem összehasonlítására.
Ezt a JSON-t fogjuk használni bemenetként s1:
{"name": "John", "score": 5,0}
Hasonlítsuk össze egy másik JSON-val, amelyet definiáltunk s2:
{"name": "John", "score": 5}
Ezt meg kell figyelnünk az attribútum értékei pontszám bemenetben s1 és s2 nem ugyanazok.
Olvassuk el a JSON bemenetet JsonNode és hasonlítsa össze:
JsonNode actualObj1 = mapper.readTree (s1); JsonNode actualObj2 = mapper.readTree (s2); assertNotEquals (ténylegesObj1, ténylegesObj2);
Mint észrevehetjük, a két objektum nem egyenlő. A szabvány egyenlő () A módszer az 5.0 és 5 értékeket különbözõnek tekinti.
Azonban, használhatunk egy szokást Összehasonlító összehasonlítani az 5. és 5.0 értékeket, és egyenlőnek tekinteni őket.
Először hozzunk létre egy Összehasonlító kettőt összehasonlítani NumericNode tárgyak:
public class NumericNodeComparator implementálja a Comparator {@Orride public int Compare (JsonNode o1, JsonNode o2) {if (o1.egyenlő (o2)) {return 0; } if ((a NumericNode o1 példánya) && (NumericNode o2 példánya)) {Double d1 = ((NumericNode) o1) .asDouble (); Dupla d2 = ((NumericNode) o2) .asDouble (); if (d1.compareTo (d2) == 0) {visszatér 0; }} return 1; }}
Ezután nézzük meg, hogyan kell ezt használni Összehasonlító:
NumericNodeComparator cmp = new NumericNodeComparator (); assertTrue (ténylegesObj1.egyenlő (cmp, ténylegesObj2));
4.2. Egyéni összehasonlító a szövegértékek összehasonlításához
Lássunk egy másikat példa egy szokásra Összehasonlító eset-érzéketlen összehasonlításhoz két JSON-érték közül.
Ezt a JSON-t fogjuk használni bemenetként s1:
{"name": "john", "score": 5}
Hasonlítsuk össze egy másik JSON-val, amelyet definiáltunk s2:
{"name": "JOHN", "score": 5}
Amint láthatjuk az attribútumot név kisbetűs a bevitelben s1 és nagybetűvel s2.
Először hozzunk létre egy Összehasonlító kettőt összehasonlítani TextNode tárgyak:
public class TextNodeComparator megvalósítja a Comparator {@Orride public int Compare (JsonNode o1, JsonNode o2) {if (o1.egyenlő (o2)) {return 0; } if ((a TextNode o1 példánya) && (TextNode o2 példánya)) {String s1 = ((TextNode) o1) .asText (); Karakterlánc s2 = ((TextNode) o2) .asText (); if (s1.equalsIgnoreCase (s2)) {visszatér 0; }} return 1; }}
Lássuk, hogyan lehet összehasonlítani s1 és s2 felhasználásával TextNodeComparator:
JsonNode actualObj1 = mapper.readTree (s1); JsonNode actualObj2 = mapper.readTree (s2); TextNodeComparator cmp = new TextNodeComparator (); assertNotEquals (ténylegesObj1, ténylegesObj2); assertTrue (ténylegesObj1.egyenlő (cmp, ténylegesObj2));
Végül láthatjuk egy egyedi összehasonlító objektum használatát, miközben összehasonlítjuk két JSON objektumot nagyon hasznos lehet, ha a bemeneti JSON elem értéke nem teljesen azonos, de továbbra is egyenlőnek akarjuk kezelni őket.
5. Következtetés
Ebben a gyors oktatóanyagban láthattuk, hogyan lehet Jackson segítségével összehasonlítani két JSON-objektumot, és egyéni összehasonlítót használni.
Természetesen, mint mindig, az itt tárgyalt összes példa teljes forráskódja megtalálható a GitHubon.