Vergelijk twee JSON-objecten met Gson

1. Overzicht

JSON is een tekenreeksweergave van gegevens. Het kan zijn dat we deze gegevens willen vergelijken in onze algoritmen of tests. En hoewel het mogelijk is om strings met JSON te vergelijken, stringvergelijking is gevoelig voor verschillen in weergave, in plaats van inhoud.

Om dit te verhelpen en JSON-gegevens semantisch te vergelijken, moeten we de gegevens in een structuur in het geheugen laden die niet wordt beïnvloed door zaken als witruimte of door de volgorde van de sleutels van een object.

In deze korte tutorial lossen we dit op met Gson, een JSON-serialisatie \ deserialisatiebibliotheek die een grondige vergelijking tussen JSON-objecten kan maken.

2. Semantisch identieke JSON in verschillende strings

Laten we het probleem dat we proberen op te lossen eens nader bekijken.

Stel dat we twee strings hebben die dezelfde JSON-gegevens vertegenwoordigen, maar een van hen heeft wat extra spaties aan het einde ervan:

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

Hoewel de inhoud van de JSON-objecten gelijk is, zal het vergelijken van het bovenstaande als strings een verschil laten zien:

assertNotEquals (string1, string2);

Hetzelfde zou gebeuren als de volgorde van sleutels in een object zou worden gevarieerd, ook al is JSON hier meestal niet gevoelig voor:

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

Daarom zouden we er baat bij hebben om een ​​JSON-verwerkingsbibliotheek te gebruiken om JSON-gegevens te vergelijken.

3. Maven Afhankelijkheid

Om Gson te gebruiken, moeten we eerst de Gson Maven-afhankelijkheid toevoegen:

 com.google.code.gson gson 2.8.6 

4. JSON parseren in Gson-objecten

Laten we, voordat we kijken naar het vergelijken van objecten, eens kijken hoe Gson JSON-gegevens in Java weergeeft.

Wanneer we met JSON in Java werken, moeten we eerst de JSON-string naar een Java-object converteren. Gson biedt JsonParser die bron-JSON parseert in een JsonElement boom:

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

JsonElement is een abstracte klasse die een element van JSON vertegenwoordigt. De ontleden methode retourneert een implementatie van JsonElement; ofwel een JsonObject, JsonArray, JsonPrimitive of JsonNull:

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

Elk van die subklassen (JsonObject, JsonArray, enz.) overschrijft de Object. Is gelijk methode, die een effectieve diepe JSON-vergelijking biedt.

5. Gson-vergelijking gebruiksscenario's

5.1. Vergelijk twee eenvoudige JSON-objecten

Stel dat we twee strings hebben die eenvoudige JSON-objecten vertegenwoordigen, waarbij de volgorde van de sleutels anders is:

Het eerste object heeft voor-en achternaam vroeger dan leeftijd:

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

De tweede keert de volgorde om:

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

We kunnen ze eenvoudig ontleden en vergelijken:

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

In dit geval is het JsonParser geeft een terug JsonObject, van wie is gelijk aan implementatie is dat nietordergevoelig.

5.2. Vergelijk twee JSON-arrays

In het geval van JSON-arrays, JsonParser zal een JsonArray.

Als we één array in één volgorde hebben:

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

We kunnen het in een andere volgorde met een ander vergelijken:

[20, 10, 30]

in tegenstelling tot JsonObject, JsonArray‘S is gelijk aan methode is ordergevoelig, dus deze arrays zijn niet gelijk, wat semantisch correct is:

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

5.3. Vergelijk twee geneste JSON-objecten

Zoals we eerder zagen, JsonParser kan de boomachtige structuur van JSON ontleden. Elk JsonObject en JsonArray bevatten andere JsonElement objecten, die zelf van het type kunnen zijn JsonObject of JsonArray.

Wanneer we gebruiken is gelijk aan, het vergelijkt alle leden recursief, wat betekent geneste objecten zijn ook vergelijkbaar:

Als dit is tekenreeks1:

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

En deze JSON is tekenreeks2:

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

Dan kunnen we nog steeds de is gelijk aan methode om ze te vergelijken:

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

6. Conclusie

In dit korte artikel hebben we gekeken naar de uitdagingen van het vergelijken van JSON met een Draad. We hebben gezien hoe Gson ons in staat stelt om die strings te parseren in een objectstructuur die vergelijking ondersteunt.

Zoals altijd is de broncode van de bovenstaande voorbeelden te vinden op GitHub.