Usporedite dva JSON objekta s Jacksonom

1. Pregled

U ovom ćemo članku pogledati usporedbu dva JSON objekta pomoću Jackson - JSON knjižnice za obradu za Javu.

2. Ovisnost Mavena

Prvo, dodajmo jackson-databind Ovisnost o Mavenu:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

3. Korištenje Jacksona za usporedbu dva JSON objekta

Koristit ćemo ObjectMapper klasa za čitanje objekta kao a JsonNode.

Stvorimo ObjectMapper:

Mapa ObjectMapper = novi ObjectMapper ();

3.1. Usporedite dva jednostavna JSON objekta

Počnimo s upotrebom JsonNode.equals metoda. The jednako () metoda izvodi potpunu (duboku) usporedbu.

Pretpostavimo da imamo JSON niz definiran kao s1 varijabla:

{"zaposlenik": {"id": "1212", "fullName": "John Miles", "dob": 34}}

I želimo ga usporediti s drugim JSON-om, s2:

{"zaposlenik": {"id": "1212", "dob": 34, "puno ime": "John Miles"}}

Pročitajmo ulazni JSON kao JsonNode i usporedite:

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

Važno je to napomenuti iako je redoslijed atributa u ulaznim JSON varijablama s1 i s2 nije isto, jednako () metoda ignorira redoslijed i tretira ih kao jednake.

3.2. Usporedite dva JSON objekta s ugniježđenim elementom

Dalje ćemo vidjeti kako usporediti dva JSON objekta koji imaju ugniježđene elemente.

Počnimo s JSON-om definiranim kao s1 varijabla:

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

Kao što vidimo, JSON sadrži ugniježđeni element kontakt. Želimo ga usporediti s drugim JSON-om definiranim s2:

{"zaposlenik": {"id": "1212", "dob": 34, "puno ime": "John Miles", "kontakt": {"e-pošta": "[e-pošta zaštićena]", "telefon": " 9999999999 "}}}

Pročitajmo ulazni JSON kao JsonNode i usporedite:

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

Opet bismo to trebali primijetiti jednako () također može usporediti dva ulazna JSON objekta s ugniježđenim elementima.

3.3. Usporedite dva JSON objekta koji sadrže element popisa

Slično tome, također možemo usporediti dva JSON objekta koji sadrže element popisa.

Razmotrimo ovaj JSON definiran kao s1:

{"zaposlenik": {"id": "1212", "fullName": "John Miles", "dob": 34, "vještine": ["Java", "C ++", "Python"]}}

Uspoređujemo ga s drugim JSON-om s2:

{"zaposlenik": {"id": "1212", "dob": 34, "puno ime": "John Miles", "vještine": ["Java", "C ++", "Python"]}}

Pročitajmo ulazni JSON kao JsonNode i usporedite:

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

Važno je to znati dva se elementa popisa uspoređuju kao jednaka samo ako imaju iste vrijednosti u potpuno istom redoslijedu.

4. Usporedite dva JSON objekta s prilagođenim usporednikom

JsonNode.equals djeluje prilično dobro u većini slučajeva. Jackson također pruža JsonNode.equals (usporednik, JsonNode) za konfiguriranje prilagođenog Java Comparator objekt. Razumijemo kako koristiti običaj Usporednik.

4.1. Prilagođeni usporednik za usporedbu numeričkih vrijednosti

Razumijemo kako koristiti običaj Usporednik za usporedbu dva JSON elementa koji imaju numeričke vrijednosti.

Koristit ćemo ovaj JSON kao ulaz s1:

{"name": "John", "score": 5,0}

Usporedimo s drugim JSON-om definiranim kao s2:

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

To moramo promatrati vrijednosti atributa postići u ulazima s1 i s2 nisu isto.

Pročitajmo ulazni JSON kao JsonNode i usporedite:

JsonNode actualObj1 = mapper.readTree (s1); JsonNode actualObj2 = mapper.readTree (s2); assertNotEquals (stvarniObj1, stvarniObj2);

Kao što možemo primijetiti, dva predmeta nisu jednaka. Standard jednako () metoda smatra vrijednosti 5.0 i 5 različitim.

Međutim, možemo se poslužiti običajem Usporednik usporediti vrijednosti 5 i 5,0 i tretirati ih kao jednake.

Prvo stvorimo a Usporednik da usporedimo dva Numerički čvor objekti:

javna klasa NumericNodeComparator implementira komparator {@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 (); Dvostruko d2 = ((Numerički čvor) o2) .asDouble (); if (d1.compareTo (d2) == 0) {return 0; }} povratak 1; }}

Dalje, da vidimo kako to koristiti Usporednik:

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

4.2. Prilagođeni usporednik za usporedbu tekstualnih vrijednosti

Da vidimo još jednu primjer običaja Usporednik za usporedbu bez velikih i malih slova od dvije JSON vrijednosti.

Koristit ćemo ovaj JSON kao ulaz s1:

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

Usporedimo s drugim JSON-om definiranim kao s2:

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

Kao što možemo vidjeti atribut Ime je mala u unosu s1 i velikim slovima u s2.

Prvo stvorimo a Usporednik da usporedimo dva TextNode objekti:

javna klasa TextNodeComparator implementira Comparator {@Override public int compare (JsonNode o1, JsonNode o2) {if (o1.equals (o2)) {return 0; } if ((o1 instanca TextNode) && (o2 instanceof TextNode)) {String s1 = ((TextNode) o1) .asText (); Niz s2 = ((TextNode) o2) .asText (); if (s1.equalsIgnoreCase (s2)) {return 0; }} povratak 1; }}

Pogledajmo kako usporediti s1 i s2 koristeći TextNodeComparator:

JsonNode actualObj1 = mapper.readTree (s1); JsonNode actualObj2 = mapper.readTree (s2); TextNodeComparator cmp = novi TextNodeComparator (); assertNotEquals (stvarniObj1, stvarniObj2); assertTrue (actualObj1.equals (cmp, actualObj2));

Konačno, možemo vidjeti upotrebu prilagođenog usporednog objekta dok uspoređujemo dva JSON objekta može biti vrlo korisno kada ulazna vrijednost JSON elementa nije potpuno ista, ali ih i dalje želimo tretirati kao jednake.

5. Zaključak

U ovom smo brzom vodiču vidjeli kako koristiti Jackson za usporedbu dva JSON objekta i koristiti prilagođenu usporedbu.

Naravno, kao i uvijek, puni izvorni kod svih ovdje raspravljenih primjera može se naći na GitHubu.