Jackson Vs. Gson [geschlossen]


363

Nachdem ich einige vorhandene Bibliotheken nach JSON durchsucht habe, habe ich endlich diese beiden gefunden:

  • Jackson
  • Google GSon

Ich bin ein bisschen teilweise in Richtung Gson, aber Wort auf dem Netz ist , dass Gson von einer bestimmten Himmel Leistung leidet Ausgabe (Stand : September 2009).

Ich setze meinen Vergleich fort; In der Zwischenzeit suche ich Hilfe, um mich zu entscheiden.


3
Für die Android-Nutzung ist der neueste Leistungsbenchmark, den ich gesehen habe, folgender: martinadamek.com/2011/02/04/…
StaxMan


7
Ein kurzer Hinweis: Wer sich für GSon entscheidet, sollte unbedingt 2.1 verwenden - die Leistung ist schließlich messbar besser als bei früheren Versionen.
StaxMan

46
Mit derzeit 74 Stimmen hat diese Frage offensichtlich einige wertvolle Antworten. Gute Antworten trumpfen mit "nicht konstruktiven" Fragen auf. Abstimmung zur Wiedereröffnung.
Nicholas

1
Jacksons Dokumentation wird jetzt lächerlich komplex. . .
Dongshengcn

Antworten:


117

Ich habe diese Recherche in der letzten Woche durchgeführt und am Ende die gleichen 2 Bibliotheken erhalten. Da ich Spring 3 verwende (das Jackson in seiner Standard-Json-Ansicht ' JacksonJsonView ' übernimmt ), war es für mich natürlicher, dasselbe zu tun. Die 2 lib sind ziemlich gleich ... am Ende werden sie einfach einer json-Datei zugeordnet! :) :)

Wie Sie sagten, hat Jackson ein + in der Leistung und das ist sehr wichtig für mich. Das Projekt ist auch ziemlich aktiv, wie Sie auf ihrer Webseite sehen können, und das ist auch ein sehr gutes Zeichen.


2
Außerdem unterstützt Google GSon noch keine Zirkelverweise. Behandelt Jackson sie?
Guido

1
Unterstützung für Zirkelverweise ... das sollte ein Hauptmerkmal sein, aber ich bin mir nicht sicher, ob es sie unterstützt. Ich habe bisher noch nie einen Zirkelverweis gefunden (auch wenn sie meiner Meinung nach recht häufig sein sollten, insbesondere im Modell). . Hier ist ein weiterer Benchmark, der hervorheben kann, wie schnell Jackson im Vergleich zu GSon ist. Es sieht 100x schneller aus in Serialization / Deserialization code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson

1
Jackson behandelt derzeit keine Zirkelverweise. Wenn dies wichtig ist, tut XStream dies.
Ich bin

11
Ab Version 1.6 unterstützt Jackson Zirkelverweise. Siehe Bidirektionale Verweise mit deklarativen Methoden als Referenz behandeln.
Ophir Radnitz

Jackson hat mehr Sicherheitsprobleme, um zu befestigen
TuGordoBello

83

Jackson und Gson sind die vollständigsten Java JSON-Pakete in Bezug auf die tatsächliche Unterstützung der Datenbindung. Viele andere Pakete bieten nur primitive Map / List-Bindungen (oder gleichwertige Baummodelle). Beide bieten vollständige Unterstützung für generische Typen sowie ausreichende Konfigurierbarkeit für viele gängige Anwendungsfälle.

Da ich mit Jackson besser vertraut bin, gibt es einige Aspekte, bei denen Jackson meiner Meinung nach umfassendere Unterstützung bietet als Gson (Entschuldigung, wenn ich eine Gson-Funktion vermisse):

  • Umfangreiche Unterstützung für Anmerkungen; einschließlich vollständiger Vererbung und erweiterter "Mix-In" -Anmerkungen (Verknüpfen von Anmerkungen mit einer Klasse für Fälle, in denen Sie sie nicht direkt hinzufügen können)
  • Streaming (inkrementelles) Lesen, Schreiben für Anwendungsfälle mit extrem hoher Leistung (oder mit begrenztem Speicher); kann mit Datenbindung gemischt werden (Unterbäume binden) - BEARBEITEN : Die neuesten Versionen von Gson enthalten auch einen Streaming-Reader
  • Baummodell (DOM-ähnlicher Zugriff); kann zwischen verschiedenen Modellen konvertieren (Baum <-> Java-Objekt <-> Stream)
  • Kann beliebige Konstruktoren (oder statische Factory-Methoden) verwenden, nicht nur Standardkonstruktoren
  • Feld- und Getter / Setter-Zugriff (frühere gson-Versionen verwendeten nur Felder, dies hat sich möglicherweise geändert)
  • Standardmäßige JAX-RS-Unterstützung
  • Interoperabilität: Kann auch JAXB-Annotationen verwenden, bietet Unterstützung / Workarounds für gängige Pakete (joda, ibatis, cglib) und JVM-Sprachen (groovy, clojure, scala).
  • Möglichkeit, die statische (deklarierte) Typbehandlung für die Ausgabe zu erzwingen
  • Unterstützung für das Deserialisieren polymorpher Typen (Jackson 1.5) - kann Dinge wie List korrekt serialisieren UND deserialisieren (mit zusätzlichen Typinformationen)
  • Integrierte Unterstützung für binären Inhalt (base64 zu / von JSON Strings)

6
In diesem Beitrag - cowtowncoder.com/blog/archives/2010/11/entry_434.html - werden viele Jackson-Funktionen zusammengefasst, die in anderen Paketen nicht enthalten sind.
StaxMan

12
Ich würde in Betracht ziehen, keine Anmerkungen als Merkmal von GSON zu verlangen, nicht als Mangel (den Sie oben mindestens dreimal aufgeführt haben).
Orbfish

6
Weder Jackson noch Gson erfordern die Verwendung von Anmerkungen. Anmerkungen als Option zu haben, ist meiner Meinung nach ein wertvolles Merkmal (insbesondere "Mix-In-Anmerkungen", eine zusätzliche Verarbeitungsoption, um die Zuordnung externer Konfigurationen zu ermöglichen).
StaxMan

3
Mit Gson können Sie einen InstanceCreator registrieren, um eine alternative Methode zum Erstellen einer Instanz anzugeben, anstatt einen Standardkonstruktor zu verwenden.
Inder

37

Gson 1.6 enthält jetzt eine Low-Level-Streaming-API und einen neuen Parser, der tatsächlich schneller als Jackson ist.


Ich wäre an einer Messung interessiert, die dies bestätigt. Zumindest Messungen unter: wiki.fasterxml.com/JacksonInFiveMinutes zeigen immer noch, dass GSON nicht mit anderen Java-json-Paketen konkurriert.
StaxMan

1
Wir haben Mikro-Benchmarks zur Verfügung (eingecheckt in das Gson-Subversion-Repository unter Trunk / Metrics-Verzeichnis), die zeigen, dass bei einfachen Objektkonvertierungen die Streaming-API auf niedriger Ebene bis zu 10-mal schneller sein kann. Es gibt auch andere Benchmarks (zu deren Veröffentlichung ich den ursprünglichen Autor ermutigen muss), dass diese Low-Level-API derzeit andere Bibliotheken, einschließlich Jackson, übertrifft. Die Erstellung umfassender und repräsentativer Benchmarks wird jedoch einige Zeit und Mühe in Anspruch nehmen.
Inder

3
Ein weiterer Datenpunkt: jvm-serializers ( github.com/eishay/jvm-serializers ) verfügt jetzt über einen "gson / manual" -Test, bei dem die GSON-Streaming-API als Alternative zur Datenbindung verwendet wird. Sobald der Autor "offizielle" Nummern hat, kann das Wiki aktualisiert werden. Aber wenn ich das lokal ausführe, denke ich nicht, dass es Aussagen unterstützt, super schnell zu sein.
StaxMan

12
(zusätzlich zu oben: offizielle Zahlen waren enthalten - Streaming Gson ist schneller als Datenbindung, aber nicht bis zum Leistungsniveau von Jackson)
StaxMan

9
... für alle, die nachverfolgen, hat Gson 2.1 schließlich signifikante und messbare Leistungsverbesserungen erzielt.
StaxMan

13

Hinzufügen zu anderen Antworten, die bereits oben gegeben wurden. Wenn für Sie die Groß- und Kleinschreibung von Bedeutung ist, verwenden Sie Jackson. Gson unterstützt keine Groß- und Kleinschreibung für Schlüsselnamen, während Jackson dies tut.

Hier sind zwei verwandte Links

(Nein) Unterstützung der Groß- und Kleinschreibung in Gson: GSON: Wie erhalte ich von Json ein Element, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird?

Unterstützung für Groß- und Kleinschreibung in Jackson https://gist.github.com/electrum/1260489


Das Snippet zur Unterstützung der Groß- und Kleinschreibung in Jackson funktioniert nicht . Oder besser gesagt, es funktioniert nur für Eigenschaften der obersten Ebene. Wenn Sie versuchen, eine Eigenschaft zu verschachteln, wird Ihre Lösung nicht funktionieren.
Andres F.

1
Tatsächlich gibt es formale Unterstützung für Eigenschaften, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, hinzugefügt in Jackson 2.5. Sie müssen dafür also keinen benutzerdefinierten Code hinzufügen.
StaxMan

6

Es scheint, dass GSon JAXB nicht unterstützt. Durch die Verwendung der mit JAXB-Annotationen versehenen Klasse zum Erstellen oder Verarbeiten der JSON-Nachricht kann ich dieselbe Klasse zum Erstellen der Restful Web Service-Schnittstelle mithilfe von Spring MVC verwenden.


Wenn Sie bereits Anmerkungen zu Ihren Datenklassen für den Ruhezustand haben, möchten Sie ohnehin keinen weiteren Satz für JAXB.
Orbfish

1
Es ist schön, Unterstützung für "ausländische" Anmerkungen hinzufügen zu können. Jackson verfügt über ein optionales JAXB-Annotationsmodul sowie ein Hibernate-Modul für einige seiner Annotationen (für vorübergehende, verzögerte Ladevorgänge). Vielleicht könnte Gson erweitert werden, um auch modulare Erweiterungen zu ermöglichen.
StaxMan

2
Zumal JAXB ein Standard ist!
Maxxyme
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.