Sammenlign to JSON-objekter med Gson

1. Oversikt

JSON er en strengrepresentasjon av data. Det kan være lurt å sammenligne disse dataene i algoritmene eller testene våre. Og selv om det er mulig å sammenligne strenger som inneholder JSON, strengesammenligning er følsom for forskjeller i representasjon, snarere enn innhold.

For å overvinne dette og sammenligne JSON-data semantisk, må vi laste dataene inn i en struktur i minnet som ikke påvirkes av ting som mellomrom eller rekkefølgen på et objekts nøkler.

I denne korte opplæringen løser vi dette ved hjelp av Gson, et JSON-serialiserings- / deserialiseringsbibliotek som kan gjøre en dyp sammenligning mellom JSON-objekter.

2. Semantisk identisk JSON i forskjellige strenger

La oss se nærmere på problemet vi prøver å løse.

Anta at vi har to strenger, som representerer de samme JSON-dataene, men en av dem har noen ekstra mellomrom på slutten av den:

String string1 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}"; String string2 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}";

Selv om innholdet i JSON-objektene er likt, vil sammenligning av ovennevnte som strenger vise en forskjell:

assertNotEquals (streng1, streng2);

Det samme ville skjedd hvis rekkefølgen på nøklene i et objekt ble variert, selv om JSON vanligvis ikke er følsom for dette:

String string1 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}"; String string2 = "{\" age \ ": 27, \" fullName \ ": \" Emily Jenkins \ "}"; assertNotEquals (streng1, streng2);

Dette er grunnen til at vi vil ha nytte av å bruke et JSON-behandlingsbibliotek for å sammenligne JSON-data.

3. Maven avhengighet

For å bruke Gson, la oss først legge til Gson Maven-avhengigheten:

 com.google.code.gson gson 2.8.6 

4. Analyse av JSON i Gson Objects

Før vi dykker inn i å sammenligne objekter, la oss se på hvordan Gson representerer JSON-data i Java.

Når vi jobber med JSON i Java, må vi først konvertere JSON-strengen til et Java-objekt. Gson gir JsonParser som analyserer kilden JSON til en JsonElement tre:

JsonParser parser = ny JsonParser (); String objectString = "{\" customer \ ": {\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}}"; String arrayString = "[10, 20, 30]"; JsonElement json1 = parser.parse (objectString); JsonElement json2 = parser.parse (arrayString);

JsonElement er en abstrakt klasse, som representerer et element av JSON. De analysere metoden returnerer en implementering av JsonElement; enten a JsonObject, JsonArray, JsonPrimitive eller JsonNull:

assertTrue (json1.isJsonObject ()); assertTrue (json2.isJsonArray ());

Hver av disse underklassene (JsonObject, JsonArray, etc.) overstyrer Objekt. Lik metode, som gir en effektiv dyp JSON-sammenligning.

5. Brukssaker for Gson-sammenligning

5.1. Sammenlign to enkle JSON-objekter

Anta at vi har to strenger som representerer enkle JSON-objekter, hvor rekkefølgen på nøklene er forskjellig:

Det første objektet har fullt navn tidligere enn alder:

{"customer": {"id": 44521, "fullName": "Emily Jenkins", "age": 27}}

Den andre reverserer rekkefølgen:

{"customer": {"id": 44521, "age": 27, "fullName": "Emily Jenkins"}}

Vi kan ganske enkelt analysere og sammenligne dem:

assertEquals (parser.parse (string1), parser.parse (string2));

I dette tilfellet JsonParser returnerer a JsonObject, hvem sin er lik implementering er ikkeordensensitiv.

5.2. Sammenlign to JSON-arrays

I tilfelle av JSON-matriser, JsonParser vil returnere en JsonArray.

Hvis vi har en matrise i en rekkefølge:

[10, 20, 30]
assertTrue (parser.parse (string1) .isJsonArray ());

Vi kan sammenligne det med en annen i en annen rekkefølge:

[20, 10, 30]

I motsetning til JsonObject, JsonArray‘S er lik metoden er ordensensitiv, så disse matriser er ikke like, noe som er semantisk korrekt:

assertNotEquals (parser.parse (string1), parser.parse (string2));

5.3. Sammenlign to nestede JSON-objekter

Som vi så tidligere, JsonParser kan analysere den trelignende strukturen til JSON. Hver JsonObject og JsonArray inneholder annet JsonElement objekter, som selv kan være av typen JsonObject eller JsonArray.

Når vi bruker er lik, sammenligner det alle medlemmene rekursivt, noe som betyr nestede gjenstander er også sammenlignbare:

Hvis dette er streng1:

{"customer": {"id": "44521", "fullName": "Emily Jenkins", "age": 27, "consumption_info": {"fav_product": "Coke", "last_buy": "2012-04 -23 "}}}

Og dette JSON er streng2:

{"customer": {"fullName": "Emily Jenkins", "id": "44521", "age": 27, "consumption_info": {"last_buy": "2012-04-23", "fav_product": "Cola"}}}

Da kan vi fortsatt bruke er lik metode for å sammenligne dem:

assertEquals (parser.parse (string1), parser.parse (string2));

6. Konklusjon

I denne korte artikkelen har vi sett på utfordringene ved å sammenligne JSON som en String. Vi har sett hvordan Gson lar oss analysere strengene i en objektstruktur som støtter sammenligning.

Som alltid kan kildekoden til eksemplene ovenfor bli funnet på GitHub.


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