Jackson vs. Gson [cerrado]

363

Después de buscar JSON en algunas bibliotecas existentes, finalmente terminé con estos dos:

  • Jackson
  • Google GSon

Soy un poco parcial hacia GSON, pero la palabra en la red es que GSon sufre de un cierto problema de rendimiento celestial (a partir de septiembre de 2009).

Estoy continuando mi comparación; Mientras tanto, estoy buscando ayuda para decidirme.

Suraj Chandran
fuente
3
Además, para el uso de Android, el último punto de referencia de rendimiento que he visto es este: martinadamek.com/2011/02/04/…
StaxMan
77
Una nota rápida: cualquiera que elija GSon debería asegurarse de usar 2.1: su rendimiento es finalmente mucho mejor que las versiones anteriores.
StaxMan
46
Con 74 votos positivos a partir de ahora, esta pregunta obviamente tiene algunas respuestas valiosas. Las buenas respuestas triunfan sobre las preguntas "no constructivas". Votación para reabrir.
Nicholas
1
La documentación de Jackson se está volviendo ridículamente compleja ahora. . .
dongshengcn

Respuestas:

117

Hice esta investigación la semana pasada y terminé con las mismas 2 bibliotecas. Como estoy usando Spring 3 (que adopta Jackson en su vista Json predeterminada ' JacksonJsonView ') fue más natural para mí hacer lo mismo. Las 2 lib son más o menos iguales ... ¡al final simplemente se asignan a un archivo json! :)

De todos modos, como dijiste, Jackson tiene un + en rendimiento y eso es muy importante para mí. El proyecto también es bastante activo, como se puede ver en su página web, y eso también es una muy buena señal.

mickthompson
fuente
2
Además, Google GSon aún no admite referencias circulares. ¿Jackson los maneja?
Guido
1
Soporte de referencias circulares ... esa debería ser una característica principal, pero no estoy seguro de si es compatible, nunca he encontrado una referencia circular hasta ahora (incluso si deberían ser bastante comunes, creo, especialmente en el modelo) . Aquí hay otro punto de referencia que puede resaltar qué tan rápido es Jackson en comparación con GSon. Se ve 100 veces más rápido en Serialización / Deserialización code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson
1
Jackson no maneja referencias circulares actualmente. Si eso es importante, XStream lo hace; no estoy seguro si cualquier paquete JSON nativo hace (flex-JSON tal vez?)
StaxMan
11
A partir de la versión 1.6, Jackson admite referencias circulares. Consulte Manejar referencias bidireccionales utilizando métodos declarativos para referencia.
Ophir Radnitz
Jackson tiene más problemas de seguridad, acordonando para fortificarse
TuGordoBello
83

Jackson y Gson son los paquetes Java JSON más completos con respecto al soporte de enlace de datos real; muchos otros paquetes solo proporcionan enlaces primitivos de Mapa / Lista (o modelo de árbol equivalente). Ambos tienen soporte completo para tipos genéricos, así como suficiente configurabilidad para muchos casos de uso comunes.

Dado que estoy más familiarizado con Jackson, aquí hay algunos aspectos en los que creo que Jackson tiene un soporte más completo que Gson (disculpas si pierdo una función de Gson):

  • Amplio soporte de anotaciones; incluyendo herencia completa y anotaciones avanzadas de "mezcla" (asociar anotaciones con una clase para casos en los que no puede agregarlas directamente)
  • Streaming (incremental) de lectura, escritura, para casos de uso de rendimiento ultra alto (o con memoria limitada); se puede mezclar con enlace de datos (subárboles de enlace) - EDITAR : las últimas versiones de Gson también incluyen lector de transmisión
  • Modelo de árbol (acceso tipo DOM); puede convertir entre varios modelos (árbol <-> objeto java <-> secuencia)
  • Puede usar cualquier constructor (o métodos de fábrica estáticos), no solo el constructor predeterminado
  • Acceso de campo y getter / setter (las versiones anteriores de gson solo usaban campos, esto puede haber cambiado)
  • Soporte JAX-RS listo para usar
  • Interoperabilidad: también puede usar anotaciones JAXB, tiene soporte / soluciones para paquetes comunes (joda, ibatis, cglib), lenguajes JVM (maravilloso, clojure, scala)
  • Capacidad para forzar el manejo de tipo estático (declarado) para salida
  • Soporte para deserializar tipos polimórficos (Jackson 1.5): puede serializar y deserializar cosas como Lista correctamente (con información de tipo adicional)
  • Soporte integrado para contenido binario (base64 a / desde cadenas JSON)
StaxMan
fuente
66
En realidad, esta publicación, cowtowncoder.com/blog/archives/2010/11/entry_434.html , resume muchas de las características de Jackson que no se encuentran en otros paquetes.
StaxMan
12
Consideraría que no se requiere que las anotaciones sean una característica de GSON, no una deficiencia (que ha enumerado al menos 3 veces más arriba).
orbfish
66
Ni Jackson ni Gson requieren el uso de anotaciones. Pero tener anotaciones como opción es una característica valiosa en mi opinión (especialmente "anotaciones mixtas", que es una opción de procesamiento adicional para permitir asociar la configuración externa).
StaxMan
3
Gson le permite registrar un InstanceCreator para especificar una forma alternativa de construir una instancia en lugar de usar un constructor predeterminado.
Inder
37

Gson 1.6 ahora incluye una API de transmisión de bajo nivel y un nuevo analizador que en realidad es más rápido que Jackson.

inder
fuente
Me interesaría ver una medida que respalde esto. Al menos las mediciones en: wiki.fasterxml.com/JacksonInFiveMinutes todavía indican que GSON no es competitivo con otros paquetes Java json.
StaxMan
1
Tenemos micro-puntos de referencia disponibles (registrados en el repositorio de subversión de Gson en el directorio troncal / métrica) que muestran que en conversiones de objetos simples, la API de transmisión de bajo nivel podría ser hasta 10 veces más rápida. También hay otros puntos de referencia (que necesito alentar al autor original para que publique) que esta API de bajo nivel actualmente supera a otras bibliotecas, incluida Jackson. Sin embargo, crear puntos de referencia integrales y representativos requerirá algo de tiempo y esfuerzo.
inder
3
Un punto de datos más: jvm-serializers ( github.com/eishay/jvm-serializers ) ahora tiene la prueba "gson / manual" que utiliza la API de transmisión de GSON como alternativa al enlace de datos. Una vez que el autor ejecuta los números "oficiales", la wiki se puede actualizar. Pero al ejecutar esto localmente, no creo que admita declaraciones de ser súper rápido.
StaxMan
12
(además de lo anterior: se incluyeron números oficiales; la transmisión de Gson es más rápida que la vinculación de datos, pero no alcanza el nivel de rendimiento de Jackson)
StaxMan
99
... para cualquier persona que siga, Gson 2.1 finalmente logró mejoras de rendimiento significativas y medibles.
StaxMan
13

Agregando a otras respuestas ya dadas anteriormente. Si la insensibilidad de mayúsculas y minúsculas es importante para usted, use Jackson. Gson no admite la insensibilidad a mayúsculas y minúsculas para los nombres clave, mientras que jackson sí.

Aquí hay dos enlaces relacionados

(No) Soporte de mayúsculas y minúsculas en Gson: GSON: ¿Cómo obtener un elemento insensible a mayúsculas y minúsculas de Json?

Soporte de mayúsculas y minúsculas en Jackson https://gist.github.com/electrum/1260489

snegi
fuente
El fragmento para el soporte de mayúsculas y minúsculas en Jackson no funciona . O más bien, solo funciona para propiedades de nivel superior. Intente anidar una propiedad y verá que su solución no funciona.
Andres F.
1
En realidad, existe un soporte formal para las propiedades que no distinguen entre mayúsculas y minúsculas MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, agregado en Jackson 2.5. Por lo tanto, no es necesario agregar un código personalizado para eso.
StaxMan
6

Parece que GSon no es compatible con JAXB. Al usar la clase anotada JAXB para crear o procesar el mensaje JSON, puedo compartir la misma clase para crear la interfaz de Restful Web Service usando Spring MVC.

raymond.mh.ng
fuente
Si ya tiene anotaciones en sus clases de datos para Hibernate, de todos modos no desea otro conjunto para JAXB.
orbfish
1
Es bueno poder agregar soporte para anotaciones "extranjeras". Jackson tiene un módulo de anotación JAXB opcional, así como un módulo Hibernate para un par de sus anotaciones (por transitoriedad, carga diferida). Quizás Gson podría extenderse para permitir también extensiones modulares.
StaxMan
2
¡Especialmente porque JAXB es un estándar!
maxxyme