Jackson Vs. Gson [kapalı]


363

Mevcut bazı kütüphaneleri JSON için aradıktan sonra, sonunda bu iki ile sona erdi:

  • Jackson
  • Google GSon

GSON'a karşı kısmen kısayım, ancak internetteki kelime GSon'un belirli bir göksel performans sorunundan muzdarip olmasıdır (Eylül 2009 itibariyle).

Karşılaştırmam devam ediyor; bu arada aklımı telafi etmek için yardım arıyorum.


3
Ayrıca, Android kullanımı için gördüğüm en son performans ölçütü şudur: martinadamek.com/2011/02/04/…
StaxMan


7
Hızlı bir not: GSon'u seçen herkes 2.1 kullandığından emin olmalıdır - performansı nihayet önceki sürümlerden daha iyi ölçülebilir.
StaxMan

46
Şu andan itibaren 74 oyla, bu sorunun bazı değerli cevapları olduğu açıktır. İyi cevaplar "yapıcı olmayan" sorulardan doğar. Yeniden açmak için oylama.
Nicholas

1
Jackson'ın belgeleri artık gülünç derecede karmaşık bir hal alıyor. . .
dongshengcn

Yanıtlar:


117

Bu araştırmayı geçen hafta yaptım ve aynı 2 kütüphaneyle sonuçlandım. Spring 3'ü kullandığım için (Jackson'ı varsayılan Json görünümünde ' JacksonJsonView ' olarak benimser ) aynı şeyi yapmak benim için daha doğaldı. 2 lib hemen hemen aynı ... sonunda onlar sadece bir json dosyası eşleyin! :)

Her neyse, dediğin gibi Jackson'ın performansında bir + var ve bu benim için çok önemli. Proje, web sayfalarından da görebileceğiniz gibi oldukça aktif ve bu da çok iyi bir işaret.


2
Ayrıca, Google GSon henüz dairesel referansları desteklememektedir. Jackson onları ele alıyor mu?
Guido

1
Dairesel Referanslar desteği ... bu birincil bir özellik olmalı, ancak onları destekleyip desteklemediğinden emin değilim, şimdiye kadar hiç dairesel bir referansla karşılaşmadım (oldukça yaygın olsalar bile, özellikle modelde) . İşte, GSon ile karşılaştırıldığında Jackson'ın ne kadar hızlı olduğunu vurgulayabilen başka bir kıyaslama. Serialization / Deserialization code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson 5:10

1
Jackson şu anda dairesel referansları işlemiyor. Bu önemliyse, XStream; Herhangi bir yerli json paketinin yapamayacağından emin değilim (flex-json belki?)
StaxMan

11
1.6 sürümünden itibaren Jackson dairesel referansları destekliyor. Bkz. Referans için bildirimsel yöntemler kullanarak çift yönlü referansları işleme.
Ophir Radnitz

Jackson'ın takviye etmek için daha fazla güvenlik sorunu var
TuGordoBello

83

Jackson ve Gson, gerçek veri bağlama desteği ile ilgili en eksiksiz Java JSON paketleridir; diğer birçok paket sadece ilkel Harita / Liste (veya eşdeğer ağaç modeli) bağlaması sağlar. Her ikisi de genel tipler için tam desteğe ve birçok yaygın kullanım durumu için yeterli yapılandırmaya sahiptir.

Jackson'a daha aşina olduğum için, Jackson'ın Gson'dan daha eksiksiz bir desteğe sahip olduğunu düşündüğüm bazı yönler (bir Gson özelliğini özlediğim için özür dilerim):

  • Kapsamlı ek açıklama desteği; tam devralma ve gelişmiş "karma" ek açıklamalar dahil (ek açıklamaları doğrudan ekleyemediğiniz durumlar için bir sınıfla ilişkilendirin)
  • Ultra yüksek performans (veya bellek sınırlı) kullanım durumları için akış (artımlı) okuma, yazma; veri bağlama ile karıştırabilirsiniz (alt ağaçları bağlamak) - EDIT : Gson son sürümleri de akış okuyucu içerir
  • Ağaç modeli (DOM benzeri erişim); çeşitli modeller arasında dönüştürme yapabilirsiniz (ağaç <-> java nesnesi <-> akışı)
  • Yalnızca varsayılan kurucu değil, herhangi bir kurucu (veya statik fabrika yöntemi) kullanabilir
  • Alan ve alıcı / ayarlayıcı erişimi (önceki gson sürümlerinde yalnızca alanlar kullanılır, bu değişmiş olabilir)
  • Kullanıma hazır JAX-RS desteği
  • Birlikte çalışabilirlik: JAXB ek açıklamalarını da kullanabilir, ortak paketler (joda, ibatis, cglib), JVM dilleri (groovy, clojure, scala) için destek / geçici çözümlere sahiptir
  • Çıktı için statik (beyan edilmiş) tür işlemeyi zorlama yeteneği
  • Polimorfik tiplerin serileştirilmesi için destek (Jackson 1.5) - Liste gibi şeyleri doğru şekilde serileştirebilir ve serileştirebilir (ek tip bilgileriyle)
  • İkili içerik için entegre destek (base64 / JSON Dizeleri)

6
Aslında, bu yazı - cowtowncoder.com/blog/archives/2010/11/entry_434.html - diğer paketlerde bulunmayan Jackson özelliklerinin çoğunu özetler.
StaxMan

12
Ek açıklamaların bir eksiklik değil, GSON'un bir özelliği olmasını gerektirmemeyi düşünürüm (en az 3 kez yukarıda listelediğiniz).
orbfish

6
Ne Jackson ne de Gson ek açıklamaların kullanılmasını gerektirmez. Ancak ek açıklamaların bir seçenek olarak bulunması, benim görüşümde değerli bir özelliktir (özellikle dış yapılandırmayı ilişkilendirmek için ek işleme seçeneği olan "karma ek açıklamalar").
StaxMan

3
Gson, varsayılan bir kurucu kullanmak yerine bir örnek oluşturmanın alternatif bir yolunu belirtmek için bir InstanceCreator kaydetmenize izin verir.
inder

37

Gson 1.6 şimdi düşük seviyeli bir akış API'sı ve aslında Jackson'dan daha hızlı olan yeni bir ayrıştırıcı içeriyor.


Bunu destekleyen bir ölçüm görmek isterim. En azından şu adresteki ölçümler: wiki.fasterxml.com/JacksonInFiveMinutes , GSON'un diğer Java json paketleriyle rekabet etmediğini hala göstermektedir.
StaxMan

1
Basit nesne dönüşümlerinde, düşük düzey akış API'sinin 10 kata kadar daha hızlı olabileceğini gösteren mikro karşılaştırmalar var (gövde / metrikler dizini altında Gson alt sürüm deposuna teslim edildi). Bu düşük seviyeli API'nin şu anda Jackson da dahil olmak üzere diğer kütüphaneleri attığı diğer kriterler de var (orijinal yazarı yayınlamaya teşvik etmem gerekiyor). Ancak, kapsamlı ve temsili kriterler oluşturmak biraz zaman ve çaba gerektirecektir.
inder

3
Bir veri noktası daha var: jvm-serileştiriciler ( github.com/eishay/jvm-serializers ) artık veri bağlamaya alternatif olarak GSON akış api kullanan "gson / manual" testine sahiptir. Yazar 'resmi' numaraları çalıştırdığında, wiki güncellenebilir. Ancak bunu yerel olarak yürütmekten, süper hızlı olma ifadelerini desteklediğini düşünmüyorum.
StaxMan

12
(yukarıdakilere ek olarak: resmi numaralar dahil edildi - Gson akışının veritabanından daha hızlı olduğu, ancak Jackson performans seviyesine kadar olmadığı)
StaxMan

9
... takip eden herkes için, Gson 2.1 sonunda önemli ve ölçülebilir performans iyileştirmeleri yaptı.
Mart'ta StaxMan

13

Yukarıda verilen diğer cevaplara ekleme. Durum duyarsızlığı sizin için önemliyse, Jackson'ı kullanın. Gson, anahtar adları için büyük / küçük harfe duyarsızlığı desteklemez, jackson ise desteklemez.

İşte ilgili iki bağlantı

(Hayır) Gson'da büyük / küçük harf duyarlılığı desteği: GSON: Json'dan büyük / küçük harfe duyarlı olmayan bir öğe nasıl alınır?

Jackson'da vaka duyarlılığı desteği https://gist.github.com/electrum/1260489


Jackson'da büyük / küçük harf duyarlılığı desteği snippet'i çalışmıyor . Daha doğrusu, yalnızca üst düzey özellikler için çalışır. Bir mülkü iç içe yerleştirmeyi deneyin, çözümünüzün işe yaramadığını göreceksiniz.
Andres F.

1
Aslında MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, Jackson 2.5'e eklenen , büyük / küçük harfe duyarlı olmayan özellikler için resmi destek vardır . Bunun için özel kod eklemenize gerek yok.
StaxMan

6

GSon'un JAXB'yi desteklemediği anlaşılıyor. JSON iletisi oluşturmak veya işlemek için JAXB açıklamalı sınıf kullanarak, Bahar MVC kullanarak Restful Web Service arabirimi oluşturmak için aynı sınıfı paylaşabilirim.


Hazırda Bekletme için veri sınıflarınızda zaten ek açıklamalarınız varsa, yine de JAXB için başka bir küme istemezsiniz.
orbfish

1
"Yabancı" ek açıklamalara destek ekleyebilmek güzel. Jackson, isteğe bağlı JAXB ek açıklama modülünün yanı sıra birkaç ek açıklama için Hazırda Bekleme modülüne (geçici, tembel yükleme için) sahiptir. Belki de Gson modüler uzantılara izin verecek şekilde genişletilebilir.
Mart'ta StaxMan

2
Özellikle JAXB bir standarttır!
maxxyme
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.