2011-10-28 15 views
31

¿Cuál es la mejor biblioteca disponible para analizar JSON en Android? Sé que Android Framework tiene una biblioteca JSON integrada, y he oído hablar de GSON. Pero me pregunto si alguien ha comparado las diferentes opciones de JSON en Android y ha presentado una justificación para elegir una sobre la otra. Estoy pensando en el rendimiento y la usabilidad como el criterio principal.Comparación de rendimiento y usabilidad de las bibliotecas Android JSON

+0

Excelentes respuestas hasta el momento. Pero realmente me gustaría saber más sobre el rendimiento. –

+0

Si está pensando en el rendimiento, probablemente también debería pensar en el uso de la memoria. La versión que estoy usando de Android JSON no admite tokenización de reader/inputstream y la asignación al modelo de datos requerirá por lo tanto 2 veces la memoria. – ThomasRS

+0

En mi enlace "mucho, mucho más rápido" hay una comparación de rendimiento bastante amplia con el tiempo de serialización, el tiempo de deserialización y el tamaño. ¿Hay algo más allá de lo que estás buscando? – kabuko

Respuesta

39

Si bien hay un puñado de API Java-to/from-JSON que proporcionan una vinculación fácil (básica) entre JSON y una estructura de datos Java arbitraria, Jackson y Gson son de lejos las más sofisticadas (capaces) y características opciones ricas

En julio de 2011, publiqué una serie de varias partes en mi blog comparando el uso de Gson versus Jackson, pasando por las características tal como se organizaron en la Guía del usuario de Gson, incluyendo ejemplos de implementaciones comparables en Jackson (y implementaciones en Gson, donde la Guía del usuario de Gson estaba incompleta o rota).

La sexta parte de la serie proporciona enlaces de navegación fáciles para la comparación, así como una lista de comparación de resumen. http://programmerbruce.blogspot.com/2011/07/gson-v-jackson-part-6.html

Esta es la comparación más completa del uso de Gson versus Jackson para las tareas JSON-to/from-Java comunes conocidas.

Como se mencionó, las comparaciones de rendimiento de varias API Java-to/from-JSON están disponibles en https://github.com/eishay/jvm-serializers/wiki. El lanzamiento actual de Gson (2.0) muestra ser 16 veces más lento que el lanzamiento actual de Jackson (1.9.2) al serializar y deserializar una estructura JSON de 500 bytes, usando esfuerzos de implementación muy comparables (solo una o dos líneas de código) .

Martin Adamek publicado algunos resultados de rendimiento de diversas APIs que se ejecutan en Android en http://martinadamek.com/2011/01/31/comparison-of-json-parsers-performance-on-android/ y http://martinadamek.com/2011/02/04/json-parsers-performance-on-android-with-warmup-and-multiple-iterations/

+2

No olvide tener en cuenta el tamaño de la biblioteca. Gson tendrá unos 200kb, mientras que las 3 dependencias de Jackson correrán alrededor de 1mb. Siempre que no necesite un rendimiento extraordinario, le recomiendo a Gson la simplicidad y el tamaño de la biblioteca. – CorayThan

1

Android JSON es muy funcional, pero no tiene campanas ni silbatos. Donde GSON le permite especificar asignaciones entre sus clases y su representación json. También tiene una muy buena conversión automática de cualquier valor primitivo a json, sin ningún trabajo adicional de su parte.

El pago con GSON es si tiene mucha comunicación JSON u objetos complejos que requieren una comprobación de valor para evitar valores ilegales (como NaN) y otros casos en los que java-to-JSON es menos directo.

Pero si solo necesita enviar y recibir un objeto json simple, la biblioteca nativa hace el truco bastante respetablemente. Lo estoy usando en mi proyecto actual para publicar puntajes altos en un servidor.

3

Bueno, a veces el rendimiento y la facilidad de uso puede estar en desacuerdo, pero me he encontrado GSON sea más fácil de usar que las alternativas como Jackson, org.json y otros. Actualmente estoy serializando datos JSON que tienen objetos y listas de 3 o 4 niveles de profundidad. Dicho esto, he adaptado mi JSON para que sea más adecuado para la serialización, pero en general GSON ha sido excelente.

1

Estoy probando GSON y he intentado con algunos otros.

GSON hace un excelente trabajo de serialización (conversión de objetos a json) objetos complejos sin básicamente ningún cambio o pensamiento de su parte, pero es un poco lento y consume mucha memoria.

El sitio web GSON Roadmap indica que esperan que la versión 2.0 resuelva algunos problemas de rendimiento y que saldrá a la venta en octubre de 2011 (que finalizará pronto). Así que espero que entreguen eso porque realmente lo necesito.

Otras bibliotecas (lo siento, no puedo recordar nombres en este momento) no parecen serializar también. Algunos solo pueden mirar variables públicas en sus clases o simplemente recurrir a métodos públicos que se parecen a getters/setters. Gson no lo hace de esa manera, y lo agarrará todo.

No he hecho mucho todavía en el lado deserializador (la conversión de JSON a objetos Java).

+0

Estoy haciendo compras de comparación para las bibliotecas gson, y me encantaría saber si gson 2.0+ ha mejorado mucho el rendimiento. – JimN

+0

@JimN: Sí gson 2.0 parece funcionar mejor. En realidad, hay incluso una versión más nueva que 2.0. Creo que no lo he intentado. Lo estoy usando bastante efectivamente. Una cosa a tener en cuenta: después de exportar mi aplicación y probarme, tuve problemas debido a Proguard y GSON. – Fraggle

8

GSON es realmente simple de usar y si el rendimiento no es un problema, es bastante agradable. Jackson es much, much faster y no es realmente mucho más esfuerzo de usar. Como he dicho en the past en otra pregunta relacionada con SO, obtuve grandes ganancias de rendimiento (al trabajar con conjuntos grandes de JSON) simplemente cambiando a Jackson de GSON.

3

Esta respuesta se ve desde una perspectiva de memoria, como que también se puede considerar :-P rendimiento.

Acabo de implementar el análisis de un archivo JSON de 70 KB en Android, analizando una serie de objetos que deberían cargar desde cero o actualizar objetos de enlace de datos previamente presentes, en todo HTTP.

El mayor inconveniente con el built-in org.json package para Android Runtime 3 fue

  1. el constructor JSONTokener sólo se acepta una cadena, ningún lector
  2. la falta de apoyo práctico para la extracción de análisis

Este generalmente significa que debe mantener todo el archivo en la memoria (piense en un tamaño de byte de 2x) y además mantener todos los objetos JSON resultantes en la memoria al mismo tiempo, antes de comenzar a enlazar sus datos. El peor de los casos es el tamaño de archivo 2x, los objetos JSON y los objetos de enlace de datos, generalmente al menos el doble del requisito de memoria.

Si realiza un análisis de un lector, puede bajarlo a 1x. Esa es la cosa más importante que puedes hacer desde la perspectiva de la memoria.

Y, sorpresa sorpresa, si va con algunas clases más modernas, como Jackson o simplemente las últimas fuentes de org.json, podrá sortear ambas limitaciones sin ningún problema, un tiempo de ejecución de Android más tarde también parece tener algunas clases de utilidad para JSON pull-parsing.

Si está atascado con un tiempo de ejecución antiguo, y desea mantener la huella de la aplicación, como yo, puede copiar el JSONTokener de org.json y modificar el ciclo de análisis de nivel superior (en mi caso, la matriz ciclo de parse) y hacer el enlace de datos en cada miembro de la matriz en lugar de la matriz completa a la vez. De esta forma reutilizarás los objetos JSON que ya están en el tiempo de ejecución de Android tanto como sea posible y aún obtendrás el efecto de transmisión (al precio de agregar identificadores a cada objeto de nivel superior).

+0

Me gusta esta respuesta porque explica por qué algo así como un enfoque de tokenización es más rápido. –

+0

Sí, si el retraso importante se mide como el momento en que se inician las solicitudes en red para completar el procesamiento de la respuesta, el procesamiento de transmisión es ideal tanto para XML como para JSON y seguramente también para otros formatos. – ThomasRS

1

tratar android-async-http

  • realizar peticiones HTTP asíncronas, manejar las respuestas en las devoluciones de llamada anónimos
  • peticiones HTTP ocurren fuera el hilo de interfaz de usuario
  • Solicitudes utilizan un conjunto de subprocesos para limitar el uso de recursos concurrentes
  • GET/POST params builder (RequestParams)
  • Subidas de archivos de múltiples partes sin bibliotecas de terceros adicionales
  • tamaño sobrecarga Tiny a su aplicación, solamente 25kb por todo
  • reintentos de petición inteligentes automáticos optimizados para conexiones móviles irregular
  • gzip apoyo automático de decodificación de respuesta para las solicitudes súper rápidas
  • archivo binario (imágenes, etc) descargan con BinaryHttpResponseHandler
  • Built-in de análisis de respuesta en JSON con JsonHttpResponseHandler
  • tienda de galletas persistente, guarda las cookies en SharedPreferences de su aplicación

y también puedes probar fastjson que es un procesador rápido json.

+0

Hola, lea http://stackoverflow.com/questions/how-to-answer especialmente la parte "** Proporcione contexto para enlaces **". –

Cuestiones relacionadas