ジャクソン対。Gson [終了]


363

JSONのいくつかの既存のライブラリーを検索した後、最終的に次の2つになりました。

  • ジャクソン
  • Google GSon

私はGSONに少し不満ですが、ネットで言うと、GSonは特定の天体のパフォーマンスの問題(2009年9月現在)に悩まされています。

私は私の比較を続けています。その間、私は私の決心をするための助けを探しています。


3
また、Androidの使用のために、私が見てきた最新のパフォーマンスのベンチマークは、これは次のとおりです。martinadamek.com/2011/02/04/...
StaxMan


7
簡単なメモ:GSonを選択する人は必ず2.1を使用する必要があります-そのパフォーマンスは最終的に以前のバージョンよりもかなり優れています。
StaxMan 2012

46
現在74票の賛成票があるため、この質問には明らかにいくつかの貴重な回答があります。良い答えは「建設的ではない」質問よりも優先されます。投票を再開します。
ニコラス

1
ジャクソンのドキュメントは、途方もなく複雑になっています。。。
dongshengcn 2013

回答:


117

私は先週、この調査を行い、同じ2つのライブラリーを作成しました。私はSpring 3(デフォルトのJsonビュー ' JacksonJsonView 'でJacksonを採用しています)を使用しているので、同じことをするのがより自然でした。2つのlibはほとんど同じです...最後に、それらは単にjsonファイルにマップします!:)

とにかく、ジャクソンは+のパフォーマンスを持っていると私にとって非常に重要です。彼らのウェブページからわかるように、プロジェクトは非常に活発でもあり、それも非常に良い兆候です。


2
また、Google GSonはまだ循環参照をサポートしていません。ジャクソンはそれらを扱いますか?
Guido

1
循環参照のサポート...これは主要な機能である必要がありますが、それがサポートしているかどうかはわかりません。循環参照がこれまで発生したことはありません(たとえモデルで特に一般的である必要があるとしても)。 。GSonと比較した場合のジャクソンの速度を強調できる別のベンチマークを次に示します。Serialization / Deserialization code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson

1
現在、ジャクソンは循環参照を処理していません。それが重要であれば、XStreamは重要です。ネイティブのjsonパッケージに含まれているかどうか不明(おそらくflex-json?)
StaxMan 2010年

11
バージョン1.6以降、Jacksonは循環参照をサポートしています。参照については、宣言的メソッド使用して双方向参照を処理するを参照してください。
Ophir Radnitz、2011

ジャクソンはより多くのセキュリティ問題を抱えており、要塞化を容認しています
TuGordoBello

83

JacksonとGsonは、実際のデータバインディングサポートに関する最も完全なJava JSONパッケージです。他の多くのパッケージは、プリミティブなMap / List(または同等のツリーモデル)バインディングのみを提供します。どちらもジェネリック型を完全にサポートしているだけでなく、多くの一般的なユースケースに十分な構成可能性を備えています。

私はジャクソンをよく知っているので、ジャクソンがGsonよりも完全にサポートしていると思ういくつかの側面があります(Gsonの機能を見逃した場合の謝罪)。

  • 広範なアノテーションのサポート。完全な継承と高度な「ミックスイン」アノテーションを含む(アノテーションを直接追加できない場合は、アノテーションをクラスに関連付けます)
  • ストリーミング(増分)読み取り、書き込み、超高性能(またはメモリ制限)の使用例。データバインディングと組み合わせることができます(バインドサブツリー)- 編集:Gsonの最新バージョンにはストリーミングリーダーも含まれています
  • ツリーモデル(DOMのようなアクセス); さまざまなモデル間で変換できます(ツリー<-> Javaオブジェクト<->ストリーム)
  • デフォルトのコンストラクタだけでなく、任意のコンストラクタ(または静的ファクトリメソッド)を使用できます
  • フィールドとゲッター/セッターへのアクセス(以前のgsonバージョンはフィールドのみを使用していましたが、これは変更されている可能性があります)
  • すぐに使えるJAX-RSサポート
  • 相互運用性:JAXBアノテーションも使用でき、一般的なパッケージ(joda、ibatis、cglib)、JVM言語(groovy、clojure、scala)のサポート/回避策があります。
  • 出力の静的(宣言された)タイプの処理を強制する機能
  • ポリモーフィック型の逆シリアル化のサポート(Jackson 1.5)-リストのようなものを正しくシリアライズおよび逆シリアル化できます(追加の型情報を使用)
  • バイナリコンテンツの統合サポート(JSON文字列へ/からのbase64)

6
実際、この投稿-cowtowncoder.com/blog/archives/2010/11/entry_434.html-には、他のパッケージにはないJackson機能の多くがまとめられています。
StaxMan、2011年

12
私は注釈をGSONの機能である必要はなく、欠陥ではないことを検討します(これは少なくとも3回上記にリストされています)。
orbfish 2013年

6
JacksonもGsonも注釈の使用を必要としません。しかし、オプションとして注釈を付けることは、私の意見では貴重な機能です(特に、外部構成の関連付けを可能にする追加の処理オプションである「ミックスイン注釈」)。
StaxMan 2013年

3
Gsonでは、InstanceCreatorを登録して、デフォルトのコンストラクタを使用する代わりにインスタンスを構築する別の方法を指定できます。
インダー

37

Gson 1.6には、低レベルのストリーミングAPIと、Jacksonよりも実際に高速な新しいパーサーが含まれています。


これを裏付ける測定値に興味があります。少なくともwiki.fasterxml.com/JacksonInFiveMinutesでの測定は、GSONが他のJava jsonパッケージと競合しないことをまだ示しています。
StaxMan 2011年

1
シンプルなオブジェクト変換では、低レベルのストリーミングAPIが最大10倍高速になる可能性があることを示すマイクロベンチマークが利用可能です(trunk / metricsディレクトリの下のGson subversionリポジトリにチェックインされています)。この低レベルAPIが現在、ジャクソンを含む他のライブラリを打ち負かしている他のベンチマーク(元の作者に公開を奨励する必要があります)もあります。ただし、包括的で代表的なベンチマークを作成するには、ある程度の時間と労力が必要です。
2011

3
もう1つのデータポイント:jvm-serializers(github.com/eishay/jvm-serializers)に、データバインディングの代わりにGSONストリーミングAPIを使用する「gson / manual」テストが追加されました。著者が「公式」番号を実行すると、wikiを更新できます。しかし、これをローカルで実行することから、それが超高速であるというステートメントをサポートするとは思いません。
StaxMan

12
(上記に加えて、公式の数値が含まれています-Gsonのストリーミングはデータバインディングより高速ですが、ジャクソンのパフォーマンスレベルまでではありません)
StaxMan

9
...フォローアップしている人のために、Gson 2.1は最終的に、重要で測定可能なパフォーマンスの改善をもたらしました。
StaxMan 2014年

13

上記ですでに与えられた他の回答に追加します。大文字小文字の区別が重要な場合は、Jacksonを使用してください。Gsonは、キー名の大文字と小文字を区別しませんが、jacksonはサポートします。

ここに2つの関連リンクがあります

(いいえ)Gsonでの大文字と小文字の区別のサポート: GSON:Jsonから大文字と小文字を区別しない要素を取得する方法?

Jacksonでの大文字と小文字の区別のサポート https://gist.github.com/electrum/1260489


ジャクソンの大文字と小文字を区別するためのスニペットが機能しません。むしろ、トップレベルのプロパティに対してのみ機能します。プロパティをネストしてみると、ソリューションが機能しないことがわかります。
Andres F.

1
実際MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES、Jackson 2.5で追加された、大文字と小文字を区別しないプロパティの正式なサポートがあります。そのため、カスタムコードを追加する必要はありません。
StaxMan 2016年

6

GSonはJAXBをサポートしていないようです。JAXB注釈付きクラスを使用してJSONメッセージを作成または処理することにより、同じクラスを共有して、Spring MVCを使用してRestful Webサービスインターフェースを作成できます。


Hibernateのデータクラスにすでにアノテーションがある場合は、とにかくJAXBの別のセットは必要ありません。
orbfish 2013年

1
「外部」アノテーションのサポートを追加できると便利です。ジャクソンには、オプションのJAXB注釈モジュールと、その注釈(一時性、遅延読み込み用)用のHibernateモジュールがあります。たぶん、Gsonを拡張して、モジュール式の拡張も可能にすることができます。
StaxMan 2014年

2
特にJAXBが標準なので!
maxxyme
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.