Jackson Vs. Gson [tertutup]

363

Setelah mencari melalui beberapa perpustakaan yang ada untuk JSON, saya akhirnya berakhir dengan dua ini:

  • Jackson
  • Google GSon

Saya sedikit memihak GSON, tetapi kabar di internet adalah bahwa GSon menderita masalah kinerja langit tertentu (pada September 2009).

Saya melanjutkan perbandingan saya; Sementara itu, saya mencari bantuan untuk mengambil keputusan.

Suraj Chandran
sumber
3
Juga, untuk penggunaan Android, tolok ukur kinerja terbaru yang saya lihat adalah ini: martinadamek.com/2011/02/04/...
StaxMan
1
Tolok ukur kinerja CowTalk terbaru. - Januari 08, 2011
Iogui
7
Satu catatan singkat: siapa pun yang memilih GSon harus memastikan untuk menggunakan 2.1 - kinerjanya akhirnya terukur lebih baik daripada versi sebelumnya.
StaxMan
46
Dengan 74 suara di atas sekarang, pertanyaan ini jelas memiliki beberapa jawaban yang berharga. Jawaban yang bagus menjawab pertanyaan "tidak konstruktif". Voting untuk dibuka kembali.
Nicholas
1
Dokumentasi Jackson menjadi sangat rumit sekarang. . .
dongshengcn

Jawaban:

117

Saya melakukan penelitian ini minggu lalu dan saya berakhir dengan 2 perpustakaan yang sama. Karena saya menggunakan Spring 3 (yang mengadopsi Jackson dalam tampilan default Json ' JacksonJsonView '), itu lebih alami bagi saya untuk melakukan hal yang sama. 2 lib hampir sama ... pada akhirnya mereka hanya memetakan ke file json! :)

Bagaimanapun seperti yang Anda katakan, Jackson memiliki kinerja + dan itu sangat penting bagi saya. Proyek ini juga cukup aktif seperti yang Anda lihat dari halaman web mereka dan itu pertanda yang sangat bagus juga.

mickthompson
sumber
2
Juga, Google GSon belum mendukung referensi sirkuler. Apakah Jackson menangani mereka?
Guido
1
Dukungan Referensi Lingkaran ... yang seharusnya menjadi fitur utama tapi saya tidak yakin apakah itu mendukung mereka, saya belum pernah menemukan referensi melingkar sejauh ini (bahkan jika mereka harus cukup umum saya pikir, terutama dalam model) . Berikut ini patokan lain yang dapat menyoroti seberapa cepat Jackson jika dibandingkan dengan GSon. Terlihat 100x lebih cepat dalam Serialization / Deserialization code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson
1
Jackson tidak menangani referensi melingkar saat ini. Jika itu penting, XStream melakukannya; tidak yakin apakah ada paket json asli tidak (mungkin flex-json?)
StaxMan
11
Pada versi 1.6, Jackson mendukung referensi melingkar. Lihat Menangani referensi dua arah menggunakan metode deklaratif untuk referensi.
Ophir Radnitz
Jackson memiliki lebih banyak masalah keamanan, yang dianggap untuk memperkuat
TuGordoBello
83

Jackson dan Gson adalah paket Java JSON paling lengkap mengenai dukungan pengikatan data aktual; banyak paket lain hanya menyediakan pengikatan Peta / Daftar primitif (atau model pohon setara). Keduanya memiliki dukungan lengkap untuk tipe generik, dan juga konfigurasi yang cukup untuk banyak kasus penggunaan umum.

Karena saya lebih akrab dengan Jackson, berikut adalah beberapa aspek di mana saya pikir Jackson memiliki dukungan yang lebih lengkap daripada Gson (permintaan maaf jika saya kehilangan fitur Gson):

  • Dukungan anotasi yang luas; termasuk pewarisan penuh, dan anotasi "campuran" lanjut (kaitkan anotasi dengan kelas untuk kasus di mana Anda tidak dapat langsung menambahkannya)
  • Streaming (incremental) streaming, penulisan, untuk kasus penggunaan dengan kinerja sangat tinggi (atau terbatas memori); dapat bercampur dengan pengikatan data (bind sub-tree) - EDIT : versi terbaru Gson juga menyertakan streaming reader
  • Model pohon (akses mirip DOM); dapat mengkonversi antara berbagai model (pohon <-> objek java <-> aliran)
  • Dapat menggunakan konstruktor apa pun (atau metode pabrik statis), bukan hanya konstruktor default
  • Bidang dan akses pengambil / penyetel (versi gson sebelumnya hanya menggunakan bidang, ini mungkin telah berubah)
  • Dukungan JAX-RS out-of-box
  • Interoperabilitas: juga dapat menggunakan anotasi JAXB, memiliki dukungan / penyelesaian untuk paket umum (joda, ibatis, cglib), bahasa JVM (asyik, clojure, scala)
  • Kemampuan untuk memaksa penanganan tipe statis (dinyatakan) untuk keluaran
  • Dukungan untuk deserialisasi tipe polimorfik (Jackson 1.5) - dapat membuat cerita bersambung DAN men-deserialisasi hal-hal seperti Daftar dengan benar (dengan informasi tipe tambahan)
  • Dukungan terintegrasi untuk konten biner (base64 ke / dari JSON Strings)
StaxMan
sumber
6
Sebenarnya, posting ini - cowtowncoder.com/blog/archives/2010/11/entry_434.html - merangkum banyak fitur Jackson yang tidak ditemukan dalam paket lain.
StaxMan
12
Saya akan mempertimbangkan tidak memerlukan penjelasan untuk menjadi fitur GSON, bukan kekurangan (yang telah Anda daftarkan setidaknya 3 kali di atas).
orbfish
6
Baik Jackson maupun Gson tidak memerlukan anotasi. Tetapi memiliki anotasi sebagai opsi adalah fitur yang berharga dalam pendapat saya (khususnya "campuran anotasi" yang merupakan opsi pemrosesan tambahan untuk memungkinkan mengaitkan konfigurasi eksternal).
StaxMan
3
Gson memungkinkan Anda untuk mendaftarkan InstanceCreator untuk menentukan cara alternatif untuk membangun sebuah instance daripada menggunakan konstruktor default.
inder
37

Gson 1.6 sekarang termasuk streaming API tingkat rendah dan pengurai baru yang sebenarnya lebih cepat dari Jackson.

inder
sumber
Saya akan tertarik melihat pengukuran yang mendukung ini. Setidaknya pengukuran di: wiki.fasterxml.com/JacksonInFiveMinutes masih menunjukkan bahwa GSON tidak kompetitif dengan paket json Java lainnya.
StaxMan
1
Kami memiliki micro-benchmark yang tersedia (diperiksa ke repositori subversi Gson di bawah direktori trunk / metrik) yang menunjukkan bahwa pada konversi objek sederhana, API streaming level rendah bisa mencapai 10x lebih cepat. Ada tolok ukur lain juga (yang saya perlu mendorong penulis asli untuk menerbitkan) bahwa API tingkat rendah ini saat ini mengalahkan perpustakaan lain termasuk Jackson. Namun, menciptakan tolok ukur yang komprehensif dan representatif akan membutuhkan waktu dan upaya.
inder
3
Satu lagi titik data: jvm-serializers ( github.com/eishay/jvm-serializers ) sekarang memiliki tes "gson / manual" yang menggunakan api streaming GSON sebagai alternatif pengikatan data. Setelah penulis menjalankan angka 'resmi', wiki dapat diperbarui. Tetapi dari menjalankan ini secara lokal, saya tidak berpikir itu mendukung pernyataan menjadi sangat cepat.
StaxMan
12
(tambahan di atas: angka resmi dimasukkan - streaming Gson lebih cepat daripada penyatuan data, tetapi tidak sampai ke tingkat kinerja Jackson)
StaxMan
9
... bagi siapa pun yang menindaklanjuti, Gson 2.1 akhirnya muncul dengan peningkatan kinerja yang signifikan dan terukur.
StaxMan
13

Menambahkan ke jawaban lain yang sudah diberikan di atas. Jika kepekaan kasus penting bagi Anda, maka gunakan Jackson. Gson tidak mendukung ketidakpekaan huruf untuk nama-nama kunci, sedangkan jackson tidak.

Berikut ini dua tautan terkait

(Tidak) Dukungan sensitivitas case di Gson: GSON: Bagaimana cara mendapatkan elemen case sensitif dari Json?

Dukungan sensitivitas kasus di Jackson https://gist.github.com/electrum/1260489

snegi
sumber
Cuplikan untuk dukungan sensitivitas kasus di Jackson tidak berfungsi . Atau lebih tepatnya, ini hanya berfungsi untuk properti tingkat atas. Coba nesting properti dan Anda akan melihat solusi Anda tidak berfungsi.
Andres F.
1
Sebenarnya ada dukungan formal untuk sifat case-insensitive MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, ditambahkan dalam Jackson 2.5. Jadi tidak perlu menambahkan kode khusus untuk itu.
StaxMan
6

Tampaknya GSon tidak mendukung JAXB. Dengan menggunakan kelas beranotasi JAXB untuk membuat atau memproses pesan JSON, saya dapat berbagi kelas yang sama untuk membuat antarmuka Restful Web Service dengan menggunakan pegas MVC.

raymond.mh.ng
sumber
Jika Anda sudah memiliki anotasi pada kelas data Anda untuk Hibernate, Anda tetap tidak ingin set lain untuk JAXB.
orbfish
1
Senang bisa menambahkan dukungan untuk anotasi "asing". Jackson memiliki modul anotasi JAXB opsional, serta modul Hibernate untuk beberapa anotasi (untuk transiensi, pemuatan malas). Mungkin Gson dapat diperluas untuk memungkinkan ekstensi modular juga.
StaxMan
2
Terutama karena JAXB adalah standar!
maxxyme