Bandingkan Dua Objek JSON dengan Gson

1. Ikhtisar

JSON adalah representasi string dari data. Kami mungkin ingin membandingkan data ini dalam algoritme atau pengujian kami. Dan meskipun mungkin untuk membandingkan string yang berisi JSON, perbandingan string peka terhadap perbedaan dalam representasi , bukan konten.

Untuk mengatasi ini dan membandingkan data JSON secara semantik, kita perlu memuat data ke dalam struktur di memori yang tidak terpengaruh oleh hal-hal seperti spasi atau urutan kunci objek.

Dalam tutorial singkat ini, kita akan menyelesaikannya menggunakan Gson, pustaka serialisasi \ deserialisasi JSON yang dapat melakukan perbandingan mendalam antara objek JSON.

2. JSON Semantik Identik dalam String Berbeda

Mari kita lihat lebih dekat masalah yang sedang kita coba selesaikan.

Asumsikan kita memiliki dua string, yang mewakili data JSON yang sama, tetapi salah satunya memiliki beberapa spasi tambahan di akhir:

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

Meskipun konten objek JSON sama, membandingkan di atas sebagai string akan menunjukkan perbedaan:

assertNotEquals(string1, string2);

Hal yang sama akan terjadi jika urutan kunci dalam suatu objek bervariasi, meskipun JSON biasanya tidak sensitif terhadap ini:

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

Inilah mengapa kami mendapat manfaat dari menggunakan pustaka pemrosesan JSON untuk membandingkan data JSON.

3. Ketergantungan Maven

Untuk menggunakan Gson, pertama-tama tambahkan dependensi Gson Maven:

 com.google.code.gson gson 2.8.6 

4. Parsing JSON menjadi Gson Objects

Sebelum kita mendalami membandingkan objek, mari kita lihat bagaimana Gson merepresentasikan data JSON di Java.

Saat bekerja dengan JSON di Java, pertama-tama kita perlu mengonversi String JSON menjadi objek Java. Gson menyediakan JsonParser yang mengurai JSON sumber menjadi pohon JsonElement :

JsonParser parser = new 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 adalah kelas abstrak, mewakili elemen JSON. The mengurai metode mengembalikan sebuah implementasi JsonElement ; baik JsonObject, JsonArray, JsonPrimitive atau JsonNull:

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

Masing-masing subclass ( JSONObject, JsonArray, dll) menimpa Object.equals metode, memberikan perbandingan JSON dalam efektif.

5. Kasus Penggunaan Perbandingan Gson

5.1. Bandingkan Dua Objek JSON Sederhana

Misalkan kita memiliki dua string, yang mewakili objek JSON sederhana, dengan urutan kuncinya berbeda:

Objek pertama memiliki fullName lebih awal dari usia :

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

Yang kedua membalik urutan:

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

Kami hanya dapat mengurai dan membandingkannya:

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

Dalam kasus ini, JsonParser mengembalikan JsonObject , yang implementasinya sama dengan tidak peka-pesanan .

5.2. Bandingkan Dua Array JSON

Dalam kasus array JSON, JsonParser akan mengembalikan JsonArray.

Jika kita memiliki satu larik dalam satu urutan:

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

Kita dapat membandingkannya dengan yang lain dalam urutan yang berbeda:

[20, 10, 30]

Tidak seperti JSONObject , JsonArray 's equals metode adalah agar-sensitif , sehingga array ini tidak sama, yaitu semantik benar:

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

5.3. Bandingkan Dua Objek JSON Bersarang

Seperti yang kita lihat sebelumnya, JsonParser dapat mengurai struktur JSON yang seperti pohon. Setiap JsonObject dan JsonArray berisi objek JsonElement lain , yang bisa berjenis JsonObject atau JsonArray .

Saat kita menggunakan sama , ini membandingkan semua anggota secara rekursif, yang berarti objek bertingkat juga dapat dibandingkan:

Jika ini adalah string1 :

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

Dan JSON ini adalah string2 :

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

Kemudian kita masih bisa menggunakan metode sama dengan untuk membandingkannya:

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

6. Kesimpulan

Dalam artikel singkat ini, kami telah melihat tantangan dalam membandingkan JSON sebagai String . Kami telah melihat bagaimana Gson memungkinkan kami untuk mengurai string tersebut menjadi struktur objek yang mendukung perbandingan.

Seperti biasa, kode sumber dari contoh di atas dapat ditemukan di GitHub.