Bandingkan Dua Objek JSON dengan Jackson

1. Ikhtisar

Dalam artikel ini, kita akan melihat membandingkan dua objek JSON menggunakan Jackson - pustaka pemrosesan JSON untuk Java.

2. Ketergantungan Maven

Pertama, mari tambahkan dependensi jackson-databind Maven:

 com.fasterxml.jackson.core jackson-databind 2.11.1  

3. Menggunakan Jackson untuk Membandingkan Dua Objek JSON

Kami akan menggunakan kelas ObjectMapper untuk membaca objek sebagai JsonNode.

Mari buat ObjectMapper :

ObjectMapper mapper = new ObjectMapper();

3.1. Bandingkan Dua Objek JSON Sederhana

Mari kita mulai dengan menggunakan metode JsonNode.equals . Metode equals () melakukan perbandingan penuh (dalam).

Misalkan kita memiliki string JSON yang didefinisikan sebagai variabel s1 :

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

Dan kami ingin membandingkannya dengan JSON lain, s2 :

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

Mari kita baca input JSON sebagai JsonNode dan bandingkan:

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

Penting untuk diperhatikan bahwa meskipun urutan atribut dalam variabel input JSON s1 dan s2 tidak sama, metode equals () mengabaikan urutan tersebut dan memperlakukannya sebagai sama.

3.2. Bandingkan Dua Objek JSON dengan Elemen Bersarang

Selanjutnya, kita akan melihat cara membandingkan dua objek JSON yang memiliki elemen bertingkat.

Mari kita mulai dengan JSON yang didefinisikan sebagai variabel s1 :

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

Seperti yang bisa kita lihat, JSON berisi kontak elemen bersarang . Kami ingin membandingkannya dengan JSON lain yang ditentukan oleh s2 :

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

Mari kita baca input JSON sebagai JsonNode dan bandingkan:

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

Sekali lagi, kita harus memperhatikan bahwa equals () juga dapat membandingkan dua input objek JSON dengan elemen bersarang.

3.3. Bandingkan Dua Objek JSON yang Mengandung Elemen Daftar

Demikian pula, kita juga dapat membandingkan dua objek JSON yang berisi elemen daftar.

Mari kita pertimbangkan JSON ini didefinisikan sebagai s1 :

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

Kami membandingkannya dengan JSON s2 lain :

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

Mari kita baca input JSON sebagai JsonNode dan bandingkan:

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

Penting untuk diketahui bahwa dua elemen daftar hanya dibandingkan sebagai sama jika mereka memiliki nilai yang sama dalam urutan yang sama persis.

4. Bandingkan Dua Objek JSON dengan Pembanding Kustom

JsonNode.equals berfungsi dengan baik di sebagian besar kasus. Jackson juga menyediakan JsonNode.equals (pembanding, JsonNode) untuk mengonfigurasi objek komparator Java C kustom . Mari kita pahami cara menggunakan Comparator kustom .

4.1. Pembanding Kustom untuk Membandingkan Nilai Numerik

Mari kita pahami cara menggunakan Pembanding kustom untuk membandingkan dua elemen JSON yang memiliki nilai numerik.

Kami akan menggunakan JSON ini sebagai masukan s1 :

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

Mari bandingkan dengan JSON lain yang didefinisikan sebagai s2 :

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

Perlu kita amati bahwa nilai skor atribut pada input s1 dan s2 tidak sama.

Mari kita baca input JSON sebagai JsonNode dan bandingkan:

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

Seperti yang bisa kita perhatikan, kedua objek itu tidak sama. Metode standar sama dengan () menganggap nilai 5.0 dan 5 berbeda.

Namun, kita dapat menggunakan Pembanding kustom untuk membandingkan nilai 5 dan 5.0 dan memperlakukannya sama .

Mari pertama-tama buat Pembanding untuk membandingkan dua objek NumericNode :

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; } }

Selanjutnya, mari kita lihat bagaimana menggunakan Comparator ini :

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

4.2. Pembanding Kustom untuk Membandingkan Nilai Teks

Mari kita lihat contoh lain dari Pembanding kustom untuk perbandingan tidak peka huruf besar / kecil dari dua nilai JSON.

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

Dalam tutorial singkat ini, kita telah melihat bagaimana menggunakan Jackson untuk membandingkan dua objek JSON dan menggunakan pembanding khusus .

Tentu saja, seperti biasa, kode sumber lengkap dari semua contoh yang dibahas di sini dapat ditemukan di GitHub.