Sammenlign to JSON-objekter med Jackson

1. Oversikt

I denne artikkelen vil vi se på å sammenligne to JSON-objekter ved hjelp av Jackson - et JSON-behandlingsbibliotek for Java.

2. Maven avhengighet

La oss først legge til jackson-databind Maven avhengighet:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

3. Bruke Jackson til å sammenligne to JSON-objekter

Vi bruker ObjectMapper klasse for å lese et objekt som en JsonNode.

La oss lage en ObjectMapper:

ObjectMapper mapper = ny ObjectMapper ();

3.1. Sammenlign to enkle JSON-objekter

La oss begynne med å bruke JsonNode.equals metode. De er lik() metoden utfører en full (dyp) sammenligning.

Anta at vi har en JSON-streng definert som s1 variabel:

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

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

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

La oss lese inngangen JSON som JsonNode og sammenlign:

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

Det er viktig å merke seg det selv om rekkefølgen av attributter i input JSON-variabler s1 og s2 er ikke det samme, den er lik() metoden ignorerer rekkefølgen og behandler dem som like.

3.2. Sammenlign to JSON-objekter med et nestet element

Deretter ser vi hvordan vi kan sammenligne to JSON-objekter som har nestede elementer.

La oss begynne med en JSON definert som s1 variabel:

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

Som vi kan se, inneholder JSON et nestet element ta kontakt med. Vi ønsker å sammenligne det med en annen JSON definert av s2:

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

La oss lese inngangen JSON som JsonNode og sammenlign:

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

Igjen, vi skal merke det er lik() kan også sammenligne to innspillte JSON-objekter med nestede elementer.

3.3. Sammenlign to JSON-objekter som inneholder et listeelement

På samme måte kan vi også sammenligne to JSON-objekter som inneholder et listeelement.

La oss vurdere denne JSON definert som s1:

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

Vi sammenligner det med en annen JSON s2:

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

La oss lese inngangen JSON som JsonNode og sammenlign:

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

Det er viktig å vite det to listeelementer sammenlignes bare som like hvis de har de samme verdiene i nøyaktig samme rekkefølge.

4. Sammenlign to JSON-objekter med en tilpasset komparator

JsonNode.equals fungerer ganske bra i de fleste tilfeller. Jackson gir også JsonNode.equals (komparator, JsonNode) for å konfigurere en tilpasset Java Comparator gjenstand. La oss forstå hvordan du bruker en tilpasset Komparator.

4.1. Tilpasset komparator for å sammenligne numeriske verdier

La oss forstå hvordan du bruker en tilpasset Komparator for å sammenligne to JSON-elementer som har numeriske verdier.

Vi bruker denne JSON som input s1:

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

La oss sammenligne med en annen JSON definert som s2:

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

Vi må observere det verdiene til attributtet score innganger s1 og s2 er ikke det samme.

La oss lese inngangen JSON som JsonNode og sammenlign:

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

Som vi kan merke er de to objektene ikke like. Standarden er lik() metoden anser verdiene 5.0 og 5 som forskjellige.

Derimot, vi kan bruke en tilpasset Komparator å sammenligne verdiene 5 og 5.0 og behandle dem som like.

La oss først lage en Komparator å sammenligne to NumericNode gjenstander:

offentlig klasse NumericNodeComparator implementerer Comparator {@Override public int compare (JsonNode o1, JsonNode o2) {if (o1.equals (o2)) {return 0; } if ((o1 instance of NumericNode) && (o2 instance of NumericNode)) {Double d1 = ((NumericNode) o1) .asDouble (); Dobbel d2 = ((NumericNode) o2) .asDouble (); hvis (d1.compareTo (d2) == 0) {return 0; }} returner 1; }}

Deretter, la oss se hvordan du bruker dette Komparator:

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

4.2. Egendefinert komparator for å sammenligne tekstverdier

La oss se en annen eksempel på en skikk Komparator for en sakuensensitiv sammenligning av to JSON-verdier.

Vi bruker denne JSON som input s1:

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

La oss sammenligne med en annen JSON definert som s2:

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

Som vi kan se attributtet Navn er små bokstaver s1 og store bokstaver i s2.

La oss først lage en Komparator å sammenligne to TextNode gjenstander:

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

La oss se hvordan vi kan sammenligne s1 og s2 ved hjelp av TextNodeComparator:

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

Til slutt kan vi se å bruke et tilpasset komparatorobjekt mens vi sammenligner to JSON-objekter kan være veldig nyttig når JSON-elementverdien ikke er den samme, men vi vil fortsatt behandle dem som like.

5. Konklusjon

I denne raske opplæringen har vi sett hvordan du bruker Jackson til å sammenligne to JSON-objekter og bruke en tilpasset komparator.

Selvfølgelig, som alltid, kan den fullstendige kildekoden til alle eksemplene som er diskutert her, bli funnet på GitHub.