Bandingkan Dua Objek JSON dengan Gson

1. Gambaran keseluruhan

JSON adalah representasi rentetan data. Kami mungkin ingin membandingkan data ini dalam algoritma atau ujian kami. Dan walaupun dapat membandingkan rentetan yang mengandung JSON, perbandingan rentetan sensitif terhadap perbezaan representasi , dan bukannya isi.

Untuk mengatasi ini dan membandingkan data JSON secara semantik, kita perlu memuatkan data ke dalam struktur dalam memori yang tidak dipengaruhi oleh perkara seperti ruang kosong atau susunan kunci objek.

Dalam tutorial ringkas ini, kami akan menyelesaikannya menggunakan Gson, pustaka serialisasi \ deserialization JSON yang dapat membuat perbandingan mendalam antara objek JSON.

2. JSON Semantik Secara Semantik dalam Rentetan yang berbeza

Mari kita lihat lebih dekat masalah yang cuba kita selesaikan.

Andaikan kita mempunyai dua rentetan, mewakili data JSON yang sama, tetapi salah satunya mempunyai beberapa ruang tambahan di hujungnya:

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

Walaupun kandungan objek JSON sama, membandingkan perkara di atas sebagai rentetan akan menunjukkan perbezaan:

assertNotEquals(string1, string2);

Perkara yang sama akan berlaku jika urutan kunci dalam objek bervariasi, walaupun JSON biasanya tidak sensitif terhadap ini:

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

Inilah sebabnya mengapa kita mendapat manfaat daripada menggunakan perpustakaan pemprosesan JSON untuk membandingkan data JSON.

3. Ketergantungan Maven

Untuk menggunakan Gson, mari kita tambahkan kebergantungan Gson Maven terlebih dahulu:

 com.google.code.gson gson 2.8.6 

4. Menghuraikan JSON ke dalam Objek Gson

Sebelum kita menyelidiki objek, mari kita lihat bagaimana Gson mewakili data JSON di Java.

Ketika bekerja dengan JSON di Java, pertama-tama kita perlu mengubah JSON String menjadi objek Java. Gson menyediakan JsonParser yang menguraikan sumber JSON menjadi pokok 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, yang mewakili unsur JSON. Yang menghuraikan kaedah mengembalikan pelaksanaan JsonElement ; sama ada JsonObject, JsonArray, JsonPrimitive atau JsonNull:

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

Kedua-subkelas ( JSONObject, JsonArray, dan lain-lain) mengatasi yang Object.equals kaedah, menyediakan perbandingan JSON mendalam berkesan.

5. Kes Penggunaan Perbandingan Gson

5.1. Bandingkan Dua Objek JSON Mudah

Katakan kita mempunyai dua rentetan, mewakili objek JSON sederhana, di mana urutan kekunci berbeza:

Objek pertama mempunyai nama penuh sebelum usia :

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

Yang kedua membalikkan susunan:

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

Kita hanya boleh menghuraikan dan membandingkannya:

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

Dalam kes ini, JsonParser mengembalikan JsonObject , yang pelaksanaannya sama dengan tidak peka terhadap pesanan .

5.2. Bandingkan Dua Susunan JSON

Dalam kes susunan JSON, JsonParser akan mengembalikan JsonArray.

Sekiranya kita mempunyai satu susunan dalam satu urutan:

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

Kita boleh membandingkannya dengan yang lain dalam urutan yang berbeza:

[20, 10, 30]

Tidak seperti JSONObject , JsonArray 's sama dengan kaedah adalah perintah-sensitif , jadi tatasusunan ini tidak sama, yang betul dari segi makna:

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

5.3. Bandingkan Dua Objek JSON Bersarang

Seperti yang kita lihat sebelumnya, JsonParser dapat menguraikan struktur seperti JSON pokok. Setiap JsonObject dan JsonArray mengandungi objek JsonElement lain , yang boleh menjadi jenis JsonObject atau JsonArray .

Apabila kita menggunakan sama , ia membandingkan semua anggota secara berulang, yang bermaksud objek bersarang juga dapat dibandingkan:

Sekiranya 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 boleh menggunakan kaedah sama untuk membandingkannya:

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

6. Kesimpulannya

Dalam artikel pendek ini, kami telah melihat cabaran membandingkan JSON sebagai Rentetan . Kami telah melihat bagaimana Gson membenarkan kami menguraikan rentetan itu ke dalam struktur objek yang menyokong perbandingan.

Seperti biasa, kod sumber contoh di atas boleh didapati di GitHub.