2010-03-04 21 views
307

Después de buscar en algunas bibliotecas existentes para JSON, por fin he terminado con estos dos:Jackson vs. Gson

  • Jackson
  • Google GSON

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

Estoy continuando mi comparación; Mientras tanto, estoy buscando ayuda para tomar una decisión.

+3

Además, para el uso de Android, la última referencia de rendimiento que he visto es esto: http://www.martinadamek.com/2011/02/04/json-parsers-performance-on-android-with-warmup-and-multiple-iterations/ – StaxMan

+1

[El último benchmark de rendimiento de CowTalk.] (http: //www.cowtowncoder.com/blog/archives/2011/01/entry_438 .html # enlaces) - Enero, 08, 2011 – Iogui

+7

Una nota rápida: cualquiera que elija GSon debe asegurarse de usar 2.1 - su rendimiento es finalmente mejor que las versiones anteriores. – StaxMan

Respuesta

98

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

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

+2

Además, Google GSon aún no admite referencias circulares. Jackson los maneja? –

+0

Compatibilidad con referencias circulares ... que debería ser una característica principal, pero no estoy seguro de si las admite, nunca me he encontrado con una referencia circular hasta ahora (aunque 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 si se compara con GSon. Se ve 100 veces más rápido en Serialización/Deserialización http://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 de si algún paquete json nativo lo hace (¿flex-json quizás?) – StaxMan

77

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 Mapa/Lista (o modelo de árbol equivalente). Ambos tienen soporte completo para tipos genéricos, así como la capacidad de configuración suficiente para muchos casos de uso común.

Desde que estoy más familiarizado con Jackson, aquí hay algunos aspectos en los que creo Jackson tiene el apoyo más completo que Gson (disculpas si me olvido de una característica Gson):

  • Amplio soporte de anotación; incluida la herencia completa, y anotaciones "mix-in" avanzadas (anotaciones asociadas con una clase para casos donde no se pueden agregar directamente)
  • Lectura en tiempo real (escritura incremental) para rendimiento ultra alto (o limitado por memoria) casos de uso; puede mezclarse con enlace de datos (vincular subárboles) - EDIT: las últimas versiones de Gson también incluyen lector de flujo
  • Modelo de árbol (acceso similar al DOM); puede convertir entre varios modelos (árbol < -> objeto Java < -> flujo)
  • puede utilizar cualquier constructores (o métodos de fábrica estática), no sólo constructor por defecto
  • Campo y captador de acceso/definidor (versiones anteriores GSON sólo se utilizan campos, esto puede haber cambiado)
  • fuera de la caja de JAX-RS apoyan
  • interoperabilidad: también puede utilizar las anotaciones JAXB, tiene soporte/soluciones temporales para paquetes comunes (joda, ibatis, CGLIB), idiomas JVM (groovy, clojure, scala)
  • Capacidad para forzar el manejo de tipo estático (declarado) para la 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 el contenido binario (base 64 a/de JSON Cuerdas)
+6

En realidad, esta publicación - http://www.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

+8

Consideraría que no es necesario que las anotaciones sean una característica de GSON, no es una deficiencia (que ha enumerado al menos 3 veces más arriba). – orbfish

+3

Ni Jackson ni Gson requieren el uso de anotaciones. Pero tener las anotaciones como una opción es una característica valiosa en mi opinión (especialmente las "anotaciones mixtas", que es una opción de proceso adicional para permitir la asociación de la configuración externa). – StaxMan

33

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

+0

Me interesaría ver una medida que respalde esto. Al menos las mediciones en: http://wiki.fasterxml.com/JacksonInFiveMinutes aún 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étricas) que muestran que en las 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 debo alentar al autor original a publicar) que este API de bajo nivel actualmente supera a otras bibliotecas, incluida Jackson. Sin embargo, la creación de puntos de referencia integrales y representativos llevará tiempo y esfuerzo. – inder

+3

Un punto de datos más: jvm-serializers (https://github.com/eishay/jvm-serializers) ahora tiene la prueba "gson/manual" que usa GSON streaming api 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 afirmaciones de ser superrápido. – StaxMan

5

Parece que GSon no es compatible con JAXB. Al utilizar la clase anotada de JAXB para crear o procesar el mensaje JSON, puedo compartir la misma clase para crear la interfaz del servicio web de Restful utilizando spring MVC.

+0

Si ya tiene anotaciones en sus clases de datos para Hibernate, de todos modos no quiere otro conjunto para JAXB. – orbfish

+1

Es agradable poder agregar soporte para anotaciones "extranjeras". Jackson tiene el módulo de anotación JAXB opcional, así como el módulo Hibernate para algunas de sus anotaciones (para transitorios, carga diferida). Quizás Gson podría extenderse para permitir extensiones modulares también. – StaxMan

+1

¡Especialmente cuando JAXB es un estándar! – maxxyme

10

Agregando a otras respuestas ya dadas arriba. Si la insensibilidad del caso es de alguna importancia para usted, entonces use Jackson. Gson no admite insensibilidad de mayúsculas y minúsculas para nombres clave, mientras que Jackson sí.

Aquí hay dos enlaces relacionados

(n) el apoyo entre mayúsculas y minúsculas en Gson: GSON: How to get a case insensitive element from Json?

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

+0

El fragmento para soporte de sensibilidad de mayúsculas y minúsculas en Jackson ** no funciona **. O más bien, solo funciona para propiedades de nivel superior. Intenta anidar una propiedad y verás que tu solución no funciona. –

+0

En realidad, existe un soporte formal para propiedades insensibles a mayúsculas y minúsculas, 'MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES', agregado en Jackson 2.5. Entonces no hay necesidad de agregar código personalizado para eso. – StaxMan