Saya mencari perpustakaan parsing JSON yang mendukung membandingkan dua objek JSON mengabaikan pesanan anak, khusus untuk pengujian unit JSON kembali dari layanan web.
Apakah ada perpustakaan JSON utama yang mendukung ini? Pustaka org.json hanya melakukan perbandingan referensi.
toString()
untuk mengubah objek menjadiJSON
string.Jawaban:
Sebagai titik arsitektur umum, saya biasanya menyarankan agar tidak membiarkan dependensi pada format serialisasi tertentu keluar dari lapisan penyimpanan / jaringan Anda; jadi, saya pertama-tama menyarankan Anda mempertimbangkan pengujian kesetaraan antara objek aplikasi Anda sendiri daripada manifestasi JSON mereka.
Karena itu, saya saat ini penggemar berat Jackson yang saya baca cepat dari ObjectNode.equals () implementasi mereka menunjukkan apakah perbandingan keanggotaan set yang Anda inginkan:
sumber
Coba Skyscreamer ini JSONAssert .
Its non-ketat mode memiliki dua keunggulan utama yang membuatnya kurang rapuh:
Dalam mode ketat itu berperilaku lebih seperti kelas uji json-lib.
Tes terlihat seperti ini:
Parameter dalam panggilan JSONAssert.assertEquals () diharapkanJSONString , actualDataString , dan isStrict .
Pesan hasil cukup jelas, yang penting ketika membandingkan objek JSON yang sangat besar.
sumber
JSONAssert.assertEquals(expected, data, JSONCompareMode.NON_EXTENSIBLE);
Mode NON_EXTENSIBLE berarti bahwa setiap bidang baru atau yang hilang menyebabkan kegagalan, tetapi urutannya tidak. Menggunakan false akan memicu mode lunak yang tidak akan melaporkan elemen anak tambahan atau hilang.Menggunakan GSON
Sunting: Sejak GSON v2.8.6 metode instance
JsonParser.parse
tidak digunakan lagi. Anda harus menggunakan metode statisJsonParser.parseString
:sumber
Saya akan melakukan yang berikut,
sumber
Anda bisa mencoba menggunakan kelas JSONAssert json-lib :
Memberi:
sumber
JSONAssert.assertJsonEquals( "{foo: 'bar', list: [{test: '1'}, {rest: '2'}] }", "{ foo: 'bar', list: [{rest: '2'}, {test: '1'}] }");
Dengan pesan:junit.framework.AssertionFailedError: : : objects differed at key [list];: arrays first differed at element [0];: objects differed at key [test];
Gunakan perpustakaan ini: https://github.com/lukas-krecan/JsonUnit
Pom:
IGNORING_ARRAY_ORDER - mengabaikan urutan dalam array
sumber
Jika Anda sudah menggunakan JUnit, versi terbaru sekarang menggunakan Hamcrest. Ini adalah kerangka kerja pencocokan umum (terutama berguna untuk pengujian unit) yang dapat diperluas untuk membangun pencocokan baru.
Ada perpustakaan open source kecil yang disebut
hamcrest-json
dengan pencocokan yang menyadari JSON. Itu didokumentasikan dengan baik, diuji, dan didukung. Berikut ini beberapa tautan bermanfaat:Kode contoh menggunakan objek dari perpustakaan JSON
org.json.simple
:Secara opsional, Anda dapat (1) mengizinkan array "pesanan apa pun" dan (2) mengabaikan bidang tambahan.
Karena ada berbagai perpustakaan JSON untuk Java (
Jackson
,GSON
,json-lib
, dll), hal ini berguna bahwahamcrest-json
dukungan JSON teks (sebagaijava.lang.String
), benda-benda serta native mendukung dari perpustakaan JSON Douglas Crockfordorg.json
.Akhirnya, jika Anda tidak menggunakan JUnit, Anda dapat menggunakan Hamcrest secara langsung untuk pernyataan. ( Saya menulis tentang itu di sini. )
sumber
Anda dapat mencoba JsonUnit . Itu dapat membandingkan dua objek JSON dan melaporkan perbedaan. Itu dibangun di atas Jackson.
Sebagai contoh
Hasil dalam
sumber
Satu hal yang saya lakukan dan berfungsi dengan baik adalah membaca kedua objek ke dalam HashMap dan kemudian membandingkannya dengan assertEquals biasa (). Ini akan memanggil metode equals () dari hashmaps, yang akan secara rekursif membandingkan semua objek di dalamnya (mereka akan berupa hashmaps lain atau beberapa objek bernilai tunggal seperti string atau integer). Ini dilakukan dengan menggunakan parser Jackson JSON Codehaus '.
Pendekatan serupa dapat digunakan jika objek JSON adalah array.
sumber
Saya menggunakan ini, dan berfungsi dengan baik untuk saya (dengan org.json. *):
sumber
Untuk org.json saya telah meluncurkan solusi saya sendiri, sebuah metode yang membandingkan dengan instance JSONObject. Saya tidak bekerja dengan objek JSON kompleks dalam proyek itu, jadi saya tidak tahu apakah ini bekerja di semua skenario. Juga, mengingat bahwa saya menggunakan ini dalam unit test, saya tidak melakukan upaya optimasi. Ini dia:
sumber
val1
nol, Anda akan mendapatkan NullPointerException dari kode iniif (!val1.equals(val2)) {
js2
ininull
atau tidak ketikajs1
tidaknull
Anda dapat menggunakan perpustakaan zjsonpatch , yang menyajikan informasi diff sesuai dengan RFC 6902 (JSON Patch). Sangat mudah digunakan. Silakan kunjungi halaman deskripsinya untuk penggunaannya
sumber
Saya akan mengambil perpustakaan di http://json.org/java/ , dan memodifikasi
equals
metode JSONObject dan JSONArray untuk melakukan tes kesetaraan yang mendalam. Untuk memastikan bahwa itu berfungsi tanpa menghiraukan urutan anak-anak, yang perlu Anda lakukan adalah mengganti peta bagian dalam denganTreeMap
, atau menggunakan sesuatu sepertiCollections.sort()
.sumber
Coba ini:
sumber
if (obj1Array.length() != obj2Array.length())
tidakkah semua elemen bertepatan?Saya tahu ini biasanya dianggap hanya untuk pengujian tetapi Anda bisa menggunakan Hamcrest JSON comparitorSameJSONAs di Hamcrest JSON.
Hamcrest JSON SameJSONAs
sumber
Karate adalah apa yang Anda cari. Berikut ini sebuah contoh:
(penafian: dev di sini)
sumber
Untuk membandingkan jsons, saya sarankan menggunakan JSONCompare: https://github.com/fslev/json-compare
sumber
Bagi mereka seperti saya yang ingin melakukan ini dengan Jackson, Anda dapat menggunakan unit json .
Kesalahan memberikan umpan balik yang bermanfaat tentang jenis ketidakcocokan:
sumber
Sepertinya tidak ada yang berfungsi dengan benar, jadi saya menulis ini:
sumber
Kode berikut akan lebih membantu untuk membandingkan dua JsonObject, JsonArray, JsonPrimitive dan JasonElements.
sumber
https://tech.blobcity.com/2018/09/02/json-equals-in-java-to-compare-two-jsons
sumber
Melihat jawabannya, saya mencoba JSONAssert tetapi gagal. Jadi saya menggunakan Jackson dengan zjsonpatch. Saya memposting rincian dalam jawaban SO di sini .
sumber
Solusi ini bagi saya, kerja sangat bagus:
Semoga ini bisa membantu orang lain.
sumber