Porovnajte dva objekty JSON s Jacksonom

1. Prehľad

V tomto článku sa pozrieme na porovnanie dvoch objektov JSON pomocou Jacksona - knižnice na spracovanie JSON pre Javu.

2. Závislosť od Maven

Najskôr pridajme jackson-databind Závislosť Maven:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

3. Použitie Jacksona na porovnanie dvoch objektov JSON

Budeme používať ObjectMapper triedy na čítanie objektu ako a JsonNode.

Vytvorme ObjectMapper:

ObjectMapper mapovač = nový ObjectMapper ();

3.1. Porovnajte dva jednoduché objekty JSON

Začnime použitím JsonNode.equals metóda. The rovná sa () metóda vykonáva úplné (hlboké) porovnanie.

Predpokladajme, že máme reťazec JSON definovaný ako s1 premenná:

{"employee": {"id": "1212", "fullName": "John Miles", "age": 34}}

A chceme to porovnať s iným JSON, s2:

{"employee": {"id": "1212", "age": 34, "fullName": "John Miles"}}

Poďme si prečítať vstupný JSON ako JsonNode a porovnaj:

assertEquals (mapper.readTree (s1), mapper.readTree (s2));

Je dôležité si to uvedomiť aj keď poradie atribútov vo vstupných premenných JSON s1 a s2 nie je to isté, rovná sa () metóda ignoruje poradie a zaobchádza s nimi ako s rovnocennými.

3.2. Porovnajte dva objekty JSON s vnoreným prvkom

Ďalej uvidíme, ako porovnať dva objekty JSON s vnorenými prvkami.

Začnime s JSON definovaným ako s1 premenná:

{"employee": {"id": "1212", "fullName": "John Miles", "age": 34, "contact": {"email": "[email protected]", "phone": " 9999999999 "}}}

Ako vidíme, JSON obsahuje vnorený prvok kontakt. Chceme to porovnať s iným JSON definovaným s2:

{"employee": {"id": "1212", "age": 34, "fullName": "John Miles", "contact": {"email": "[email protected]", "phone": " 9999999999 "}}}

Poďme si prečítať vstupný JSON ako JsonNode a porovnaj:

assertEquals (mapper.readTree (s1), mapper.readTree (s2)); 

To by sme si mali opäť všimnúť rovná sa () môžete tiež porovnať dva vstupné objekty JSON s vnorenými prvkami.

3.3. Porovnajte dva objekty JSON obsahujúce prvok zoznamu

Podobne môžeme tiež porovnať dva objekty JSON, ktoré obsahujú prvok zoznamu.

Zvážme tento JSON definovaný ako s1:

{"employee": {"id": "1212", "fullName": "John Miles", "age": 34, "skills": ["Java", "C ++", "Python"]}}

Porovnávame to s iným JSON s2:

{"employee": {"id": "1212", "age": 34, "fullName": "John Miles", "skills": ["Java", "C ++", "Python"]}}

Poďme si prečítať vstupný JSON ako JsonNode a porovnaj:

assertEquals (mapper.readTree (s1), mapper.readTree (s2));

Je dôležité to vedieť dva prvky zoznamu sa porovnávajú ako rovnaké iba vtedy, ak majú rovnaké hodnoty v úplne rovnakom poradí.

4. Porovnajte dva objekty JSON s vlastným komparátorom

JsonNode.equals vo väčšine prípadov funguje celkom dobre. Jackson tiež poskytuje JsonNode.equals (komparátor, JsonNode) nakonfigurovať vlastnú Java Comparátor objekt. Poďme pochopiť, ako používať zvyk Komparátor.

4.1. Vlastný komparátor na porovnanie číselných hodnôt

Poďme pochopiť, ako používať zvyk Komparátor na porovnanie dvoch prvkov JSON s číselnými hodnotami.

Tento JSON použijeme ako vstup s1:

{"name": "John", "skóre": 5.0}

Porovnajme to s iným JSON definovaným ako s2:

{"name": "John", "skóre": 5}

Musíme to pozorovať hodnoty atribútu skóre vo vstupoch s1 a s2 nie sú rovnaké.

Poďme si prečítať vstupný JSON ako JsonNode a porovnaj:

JsonNode actualObj1 = mapovač.readTree (s1); JsonNode actualObj2 = mapper.readTree (s2); assertNotEquals (actualObj1, actualObj2);

Ako si môžeme všimnúť, tieto dva objekty nie sú rovnaké. Štandart rovná sa () metóda považuje hodnoty 5,0 a 5 za odlišné.

Avšak môžeme použiť zvyk Komparátor porovnať hodnoty 5 a 5,0 a považovať ich za rovnocenné.

Najprv vytvoríme a Komparátor na porovnanie dvoch NumericNode objekty:

verejná trieda NumericNodeComparator implementuje komparátor {@Override public int compare (JsonNode o1, JsonNode o2) {if (o1.equals (o2)) {return 0; } if ((o1 instanceof NumericNode) && (o2 instanceof NumericNode)) {Double d1 = ((NumericNode) o1) .asDouble (); Double d2 = ((NumericNode) o2) .asDouble (); if (d1.compareTo (d2) == 0) {návrat 0; }} návrat 1; }}

Ďalej sa pozrime, ako to využiť Komparátor:

NumericNodeComparator cmp = nový NumericNodeComparator (); assertTrue (actualObj1.equals (cmp, actualObj2));

4.2. Vlastný komparátor na porovnanie textových hodnôt

Uvidíme ďalší príklad zvyku Komparátor pre porovnanie bez rozlišovania malých a veľkých písmen dvoch hodnôt JSON.

Tento JSON použijeme ako vstup s1:

{"name": "john", "score": 5}

Porovnajme to s iným JSON definovaným ako s2:

{"name": "JOHN", "score": 5}

Ako vidíme atribút názov je na vstupe malé s1 a veľké písmená v s2.

Najprv vytvoríme a Komparátor na porovnanie dvoch TextNode objekty:

verejná trieda TextNodeComparator implementuje komparátor {@Override public int compare (JsonNode o1, JsonNode o2) {if (o1.equals (o2)) {return 0; } if ((o1 instanceof TextNode) && (o2 instanceof TextNode)) {Reťazec s1 = ((TextNode) o1) .asText (); Reťazec s2 = (((TextNode) o2) .asText (); if (s1.equalsIgnoreCase (s2)) {návrat 0; }} návrat 1; }}

Pozrime sa, ako to môžeme porovnať s1 a s2 použitím TextNodeComparator:

JsonNode actualObj1 = mapper.readTree (s1); JsonNode actualObj2 = mapper.readTree (s2); TextNodeComparator cmp = nový TextNodeComparator (); assertNotEquals (actualObj1, actualObj2); assertTrue (actualObj1.equals (cmp, actualObj2));

Na záver môžeme vidieť použitie vlastného porovnávacieho objektu pri porovnávaní dvoch objektov JSON môže byť veľmi užitočné, keď vstupná hodnota prvku JSON nie je úplne rovnaká, ale stále s nimi chceme zaobchádzať rovnako.

5. Záver

V tomto rýchlom výučbe sme videli, ako použiť Jackson na porovnanie dvoch objektov JSON a použitie vlastného komparátora.

Celý zdrojový kód všetkých príkladov, o ktorých sa tu diskutuje, nájdete ako vždy na serveri GitHub.


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