Vergleichen Sie zwei JSON-Objekte mit Jackson

1. Übersicht

In diesem Artikel sehen wir uns an, wie zwei JSON-Objekte mit Jackson verglichen werden - einer JSON-Verarbeitungsbibliothek für Java.

2. Maven-Abhängigkeit

Fügen wir zunächst die Jackson-Databind- Maven-Abhängigkeit hinzu:

 com.fasterxml.jackson.core jackson-databind 2.11.1  

3. Verwenden von Jackson zum Vergleichen von zwei JSON-Objekten

Wir werden die ObjectMapper- Klasse verwenden, um ein Objekt als JsonNode zu lesen .

Erstellen wir einen ObjectMapper :

ObjectMapper mapper = new ObjectMapper();

3.1. Vergleichen Sie zwei einfache JSON-Objekte

Beginnen wir mit der Methode JsonNode.equals . Die Methode equals () führt einen vollständigen (tiefen) Vergleich durch.

Angenommen, wir haben eine JSON-Zeichenfolge als s1- Variable definiert:

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

Und wir wollen es mit einem anderen JSON vergleichen, s2 :

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

Lesen wir die Eingabe JSON als JsonNode und vergleichen Sie:

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

Es ist wichtig zu beachten, dass die Methode equals () die Reihenfolge ignoriert und sie als gleich behandelt , obwohl die Reihenfolge der Attribute in den JSON-Eingabevariablen s1 und s2 nicht identisch ist .

3.2. Vergleichen Sie zwei JSON-Objekte mit einem verschachtelten Element

Als Nächstes sehen wir, wie zwei JSON-Objekte mit verschachtelten Elementen verglichen werden.

Beginnen wir mit einem JSON, der als s1- Variable definiert ist:

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

Wie wir sehen können, enthält das JSON ein verschachteltes Element Kontakt . Wir wollen es mit einem anderen durch s2 definierten JSON vergleichen :

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

Lesen wir die Eingabe JSON als JsonNode und vergleichen Sie:

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

Auch hier sollten wir beachten, dass equals () auch zwei Eingabe-JSON-Objekte mit verschachtelten Elementen vergleichen kann.

3.3. Vergleichen Sie zwei JSON-Objekte, die ein Listenelement enthalten

In ähnlicher Weise können wir auch zwei JSON-Objekte vergleichen, die ein Listenelement enthalten.

Betrachten wir diesen als s1 definierten JSON :

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

Wir vergleichen es mit einem anderen JSON s2 :

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

Lesen wir die Eingabe JSON als JsonNode und vergleichen Sie:

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

Es ist wichtig zu wissen, dass zwei Listenelemente nur dann als gleich verglichen werden, wenn sie dieselben Werte in genau derselben Reihenfolge haben.

4. Vergleichen Sie zwei JSON-Objekte mit einem benutzerdefinierten Komparator

JsonNode.equals funktioniert in den meisten Fällen recht gut. Jackson bietet auch JsonNode.equals (Komparator, JsonNode) ein benutzerdefiniertes Java C konfiguriert omparator Objekt. Lassen Sie uns verstehen, wie ein benutzerdefinierter Komparator verwendet wird .

4.1. Benutzerdefinierter Komparator zum Vergleichen numerischer Werte

Lassen Sie uns verstehen, wie Sie mit einem benutzerdefinierten Komparator zwei JSON-Elemente mit numerischen Werten vergleichen.

Wir werden diesen JSON als Eingabe s1 verwenden :

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

Vergleichen wir mit einem anderen JSON, der als s2 definiert ist :

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

Wir müssen beachten , dass die Werte von Attribut - Score in Eingänge s1 und s2 sind nicht das gleiche.

Lesen wir die Eingabe JSON als JsonNode und vergleichen Sie:

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

Wie wir feststellen können, sind die beiden Objekte nicht gleich. Die Standardmethode equals () berücksichtigt die Werte 5.0 und 5 als unterschiedlich.

Jedoch können wir einen eigenen verwenden Vergleicher auf Wert 5 und 5,0 zu vergleichen und sich als gleich zu behandeln .

Erstellen wir zunächst einen Komparator , um zwei NumericNode- Objekte zu vergleichen :

public class NumericNodeComparator implements Comparator { @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(); Double d2 = ((NumericNode) o2).asDouble(); if (d1.compareTo(d2) == 0) { return 0; } } return 1; } }

Als nächstes wollen wir sehen, wie dieser Komparator verwendet wird :

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

4.2. Benutzerdefinierter Komparator zum Vergleichen von Textwerten

Sehen wir uns ein weiteres Beispiel eines benutzerdefinierten Komparators für einen Vergleich zweier JSON-Werte an, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird.

We'll use this JSON as input s1:

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

Let's compare with another JSON defined as s2:

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

As we can see the attribute name is lowercase in input s1 and uppercase in s2.

Let's first create a Comparator to compare two TextNode objects:

public class TextNodeComparator implements Comparator { @Override public int compare(JsonNode o1, JsonNode o2) { if (o1.equals(o2)) { return 0; } if ((o1 instanceof TextNode) && (o2 instanceof TextNode)) { String s1 = ((TextNode) o1).asText(); String s2 = ((TextNode) o2).asText(); if (s1.equalsIgnoreCase(s2)) { return 0; } } return 1; } }

Let's see how to compare s1 and s2 using TextNodeComparator:

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

Finally, we can see using a custom comparator object while comparing two JSON objects can be very useful when the input JSON element value is not exactly the same but we still want to treat them as equal.

5. Conclusion

In diesem kurzen Tutorial haben wir gesehen, wie Sie mit Jackson zwei JSON-Objekte vergleichen und einen benutzerdefinierten Komparator verwenden .

Natürlich finden Sie wie immer den vollständigen Quellcode aller hier diskutierten Beispiele auf GitHub.