Sammenlign to JSON-objekter med Jackson

1. Oversigt

I denne artikel skal vi se på at sammenligne to JSON-objekter ved hjælp af Jackson - et JSON-behandlingsbibliotek til Java.

2. Maven-afhængighed

Lad os først tilføje jackson-databind Maven afhængighed:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

3. Brug af Jackson til at sammenligne to JSON-objekter

Vi bruger ObjectMapper klasse for at læse et objekt som en JsonNode.

Lad os oprette en ObjectMapper:

ObjectMapper-kortlægger = ny ObjectMapper ();

3.1. Sammenlign to enkle JSON-objekter

Lad os begynde med at bruge JsonNode.equals metode. Det lige med() metode udfører en fuld (dyb) sammenligning.

Antag, at vi har en JSON-streng defineret som s1 variabel:

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

Og vi vil sammenligne det med en anden JSON, s2:

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

Lad os læse input JSON som JsonNode og sammenlign:

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

Det er vigtigt at bemærke det selvom rækkefølgen af ​​attributter i input JSON-variabler s1 og s2 er ikke det samme, det lige med() metode ignorerer rækkefølgen og behandler dem som lige.

3.2. Sammenlign to JSON-objekter med et indlejret element

Derefter ser vi, hvordan man sammenligner to JSON-objekter, der har indlejrede elementer.

Lad os begynde med en JSON defineret som s1 variabel:

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

Som vi kan se, indeholder JSON et indlejret element kontakt. Vi vil sammenligne det med en anden JSON defineret af s2:

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

Lad os læse input JSON som JsonNode og sammenlign:

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

Igen skal vi bemærke det lige med() kan også sammenligne to input JSON-objekter med indlejrede elementer.

3.3. Sammenlign to JSON-objekter, der indeholder et listeelement

På samme måde kan vi også sammenligne to JSON-objekter, der indeholder et listeelement.

Lad os overveje denne JSON defineret som s1:

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

Vi sammenligner det med en anden JSON s2:

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

Lad os læse input JSON som JsonNode og sammenlign:

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

Det er vigtigt at vide det to listeelementer sammenlignes kun som ens, hvis de har de samme værdier i nøjagtig samme rækkefølge.

4. Sammenlign to JSON-objekter med en brugerdefineret komparator

JsonNode.equals fungerer ganske godt i de fleste tilfælde. Jackson giver også JsonNode.equals (komparator, JsonNode) for at konfigurere en brugerdefineret Java Comparator objekt. Lad os forstå, hvordan man bruger en brugerdefineret Komparator.

4.1. Brugerdefineret komparator til sammenligning af numeriske værdier

Lad os forstå, hvordan man bruger en brugerdefineret Komparator for at sammenligne to JSON-elementer med numeriske værdier.

Vi bruger denne JSON som input s1:

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

Lad os sammenligne med en anden JSON defineret som s2:

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

Vi er nødt til at observere det værdierne for attribut score indgange s1 og s2 er ikke det samme.

Lad os læse input JSON som JsonNode og sammenlign:

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

Som vi kan bemærke, er de to objekter ikke ens. Standarden lige med() metoden betragter værdier 5.0 og 5 som forskellige.

Imidlertid, vi kan bruge en brugerdefineret Komparator at sammenligne værdierne 5 og 5.0 og behandle dem som lige.

Lad os først oprette en Komparator at sammenligne to NumeriskNode genstande:

offentlig klasse NumericNodeComparator implementerer Comparator {@Override public int compare (JsonNode o1, JsonNode o2) {if (o1.equals (o2)) {return 0; } hvis ((o1 forekomst af NumeriskNode) && (o2 forekomst af NumeriskNode)) {Dobbelt d1 = ((NumeriskNode) o1) .asDobbelt (); Dobbelt d2 = ((NumericNode) o2) .asDouble (); hvis (d1.compareTo (d2) == 0) {return 0; }} returner 1; }}

Lad os derefter se, hvordan du bruger dette Komparator:

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

4.2. Brugerdefineret komparator til sammenligning af tekstværdier

Lad os se en anden eksempel på en brugerdefineret Komparator til en case-ufølsom sammenligning af to JSON-værdier.

Vi bruger denne JSON som input s1:

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

Lad os sammenligne med en anden JSON defineret som s2:

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

Som vi kan se attributten navn er små bogstaver i input s1 og store bogstaver i s2.

Lad os først oprette en Komparator at sammenligne to TextNode genstande:

offentlig klasse TextNodeComparator implementerer Comparator {@ Override public int compare (JsonNode o1, JsonNode o2) {if (o1.equals (o2)) {return 0; } hvis ((o1 forekomst af TextNode) && (o2 forekomst af TextNode)) {String s1 = ((TextNode) o1) .asText (); Streng s2 = ((TextNode) o2) .asText (); hvis (s1.equalsIgnoreCase (s2)) {return 0; }} returner 1; }}

Lad os se, hvordan man sammenligner s1 og s2 ved brug af TextNodeComparator:

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

Endelig kan vi se at bruge et brugerdefineret sammenligningsobjekt, mens vi sammenligner to JSON-objekter kan være meget nyttigt, når input-JSON-elementværdien ikke er nøjagtig den samme, men vi stadig vil behandle dem som lige.

5. Konklusion

I denne hurtige vejledning har vi set, hvordan man bruger Jackson til at sammenligne to JSON-objekter og bruge en brugerdefineret komparator.

Som altid kan den fulde kildekode til alle eksemplerne, der diskuteres her, findes på GitHub.