Jackson Vs. Gson [fermé]

363

Après avoir cherché dans certaines bibliothèques existantes pour JSON, je me suis finalement retrouvé avec ces deux:

  • Jackson
  • Google GSon

Je suis un peu partial envers GSON, mais le mot sur le net est que GSon souffre d'une certaine performance céleste problème de (depuis septembre 2009).

Je continue ma comparaison; en attendant, je cherche de l'aide pour me décider.

Suraj Chandran
la source
3
En outre, pour l'utilisation d'Android, la dernière référence de performance que j'ai vue est la suivante: martinadamek.com/2011/02/04/…
StaxMan
7
Une remarque rapide: quiconque choisit GSon doit s'assurer d'utiliser la version 2.1 - ses performances sont finalement nettement meilleures que les versions précédentes.
StaxMan
46
Avec 74 votes positifs à ce jour, cette question a évidemment de précieuses réponses. Les bonnes réponses l'emportent sur les questions «non constructives». Voter pour rouvrir.
Nicholas
1
La documentation de Jackson devient ridiculement complexe maintenant. . .
dongshengcn

Réponses:

117

J'ai fait cette recherche la semaine dernière et je me suis retrouvé avec les mêmes 2 bibliothèques. Comme j'utilise Spring 3 (qui adopte Jackson dans sa vue Json par défaut « JacksonJsonView »), il était plus naturel pour moi de faire de même. Les 2 lib sont à peu près les mêmes ... à la fin, elles sont simplement mappées sur un fichier json! :)

Quoi qu'il en soit, comme vous l'avez dit, Jackson a un + en termes de performances et c'est très important pour moi. Le projet est également très actif comme vous pouvez le voir sur leur page Web et c'est aussi un très bon signe.

Mickthompson
la source
2
De plus, Google GSon ne prend pas encore en charge les références circulaires. Jackson les gère-t-il?
Guido
1
Les références circulaires prennent en charge ... cela devrait être une caractéristique principale, mais je ne suis pas sûr que cela les supporte, je n'ai jamais rencontré de référence circulaire jusqu'à présent (même si elles devraient être assez courantes, je pense, en particulier dans le modèle) . Voici une autre référence qui peut mettre en évidence la rapidité de Jackson par rapport à GSon. Il semble 100 fois plus rapide dans Sérialisation / Désérialisation code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson
1
Jackson ne gère pas actuellement les références circulaires. Si c'est important, XStream le fait; vous ne savez pas si un package json natif le fait (flex-json peut-être?)
StaxMan
11
Depuis la version 1.6, Jackson prend en charge les références circulaires. Voir Gérer les références bidirectionnelles à l'aide de méthodes déclaratives pour référence.
Ophir Radnitz
Jackson a plus de problème de sécurité, s'apprête à fortifier
TuGordoBello
83

Jackson et Gson sont les packages Java JSON les plus complets concernant la prise en charge réelle de la liaison de données; de nombreux autres packages ne fournissent qu'une liaison primitive Map / List (ou modèle d'arbre équivalent). Les deux ont également un support complet pour les types génériques, ainsi qu'une configurabilité suffisante pour de nombreux cas d'utilisation courants.

Étant donné que je connais mieux Jackson, voici certains aspects où je pense que Jackson a un support plus complet que Gson (excuses si je manque une fonctionnalité Gson):

  • Prise en charge complète des annotations; y compris l'héritage complet et les annotations avancées "mix-in" (associez les annotations à une classe pour les cas où vous ne pouvez pas les ajouter directement)
  • Lecture (écriture) en continu (incrémentielle) pour des cas d'utilisation à ultra hautes performances (ou à mémoire limitée); peut se mélanger avec la liaison de données (sous-arborescences de liaison) - EDIT : les dernières versions de Gson incluent également un lecteur de streaming
  • Modèle d'arbre (accès de type DOM); peut convertir entre différents modèles (arbre <-> objet java <-> flux)
  • Peut utiliser n'importe quel constructeur (ou méthode d'usine statique), pas seulement le constructeur par défaut
  • Accès aux champs et getter / setter (les versions précédentes de gson utilisaient uniquement les champs, cela peut avoir changé)
  • Prise en charge JAX-RS prête à l'emploi
  • Interopérabilité: peut également utiliser des annotations JAXB, prend en charge / solutions pour les packages courants (joda, ibatis, cglib), langages JVM (groovy, clojure, scala)
  • Possibilité de forcer la gestion de type statique (déclaré) pour la sortie
  • Prise en charge de la désérialisation des types polymorphes (Jackson 1.5) - peut sérialiser ET désérialiser correctement des choses comme List (avec des informations de type supplémentaires)
  • Prise en charge intégrée du contenu binaire (base64 vers / depuis les chaînes JSON)
StaxMan
la source
6
En fait, ce post - cowtowncoder.com/blog/archives/2010/11/entry_434.html - résume de nombreuses fonctionnalités de Jackson qui ne se trouvent pas dans d'autres packages.
StaxMan
12
Je considérerais de ne pas exiger que les annotations soient une caractéristique de GSON, pas une carence (que vous avez énumérée au moins 3 fois ci-dessus).
orbfish
6
Ni Jackson ni Gson ne nécessitent l'utilisation d'annotations. Mais avoir des annotations en option est une caractéristique précieuse à mon avis (en particulier "les annotations mixtes" qui est une option de traitement supplémentaire pour permettre d'associer la configuration externe).
StaxMan
3
Gson vous permet d'enregistrer un InstanceCreator pour spécifier une autre façon de construire une instance au lieu d'utiliser un constructeur par défaut.
inder
37

Gson 1.6 comprend désormais une API de streaming de bas niveau et un nouvel analyseur qui est en fait plus rapide que Jackson.

inder
la source
Je serais intéressé à voir une mesure qui confirme cela. Au moins les mesures sur: wiki.fasterxml.com/JacksonInFiveMinutes indiquent toujours que GSON n'est pas compétitif avec d'autres packages Java json.
StaxMan
1
Nous avons des micro-tests disponibles (enregistrés dans le référentiel de subversion Gson sous le répertoire trunk / metrics) qui montrent que sur les conversions d'objets simples, l'API de streaming de bas niveau pourrait être jusqu'à 10 fois plus rapide. Il existe également d'autres repères (que je dois encourager l'auteur original à publier) que cette API de bas niveau bat actuellement d'autres bibliothèques, y compris Jackson. Cependant, la création de repères complets et représentatifs va demander du temps et des efforts.
inder
3
Un autre point de données: jvm-serializers ( github.com/eishay/jvm-serializers ) a maintenant un test "gson / manual" qui utilise l'API de streaming GSON comme alternative à la liaison de données. Une fois que l'auteur a exécuté les numéros «officiels», le wiki peut être mis à jour. Mais en exécutant cela localement, je ne pense pas qu'il supporte les déclarations d'être super rapide.
StaxMan
12
(en plus de ce qui précède: les chiffres officiels ont été inclus - le streaming Gson est plus rapide que la liaison de données, mais pas au niveau des performances de Jackson)
StaxMan
9
... pour quiconque suit, Gson 2.1 a finalement apporté des améliorations de performances significatives et mesurables.
StaxMan
13

Ajout à d'autres réponses déjà données ci-dessus. Si l'insensibilité à la casse est importante pour vous, utilisez Jackson. Gson ne prend pas en charge l'insensibilité à la casse pour les noms de clés, contrairement à jackson.

Voici deux liens connexes

(Non) Prise en charge de la casse dans Gson: GSON: Comment obtenir un élément insensible à la casse de Json?

Prise en charge de la casse dans Jackson https://gist.github.com/electrum/1260489

snegi
la source
L'extrait de prise en charge de la sensibilité à la casse dans Jackson ne fonctionne pas . Ou plutôt, cela ne fonctionne que pour les propriétés de niveau supérieur. Essayez d'imbriquer une propriété et vous verrez que votre solution ne fonctionne pas.
Andres F.
1
En fait, il existe un support formel pour les propriétés insensibles à la casse MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, ajouté dans Jackson 2.5. Donc pas besoin d'ajouter du code personnalisé pour ça.
StaxMan
6

Il semble que GSon ne prend pas en charge JAXB. En utilisant la classe annotée JAXB pour créer ou traiter le message JSON, je peux partager la même classe pour créer l'interface Restful Web Service à l'aide de Spring MVC.

raymond.mh.ng
la source
Si vous avez déjà des annotations sur vos classes de données pour Hibernate, vous ne voulez de toute façon pas un autre ensemble pour JAXB.
orbfish
1
C'est agréable de pouvoir ajouter un support pour les annotations "étrangères". Jackson possède un module d'annotation JAXB en option, ainsi qu'un module Hibernate pour quelques-unes de ses annotations (pour le transitoire, le chargement paresseux). Peut-être que Gson pourrait être étendu pour permettre également des extensions modulaires.
StaxMan
2
D'autant plus que JAXB est un standard!
maxxyme