2010-03-18 15 views
15

Estoy haciendo un uso intensivo del análisis JSON en una aplicación que estoy escribiendo. La mayoría de lo que hice ya está implementado usando la biblioteca JSONObject integrada de Android (¿es json-lib?).JSON: Analizador de flujo de Jackson - ¿Realmente lo vale?

JSONObject parece crear instancias de absolutamente todo en la cadena JSON ... incluso si no termino usando todas.

Mi aplicación actualmente funciona bastante bien, incluso en un G1.

Mi pregunta es esta: ¿vale la pena la velocidad y la memoria de utilizar un analizador de flujo como Jackson?

Por problemas, me refiero a esto: Por lo que yo puedo decir, hay tres desventajas para el uso de Jackson en lugar de la incorporada en la biblioteca:

  1. La dependencia de una biblioteca externa. Esto hace que tu .apk sea más grande al final. No es un gran problema.
  2. Tu aplicación es más frágil. Como el análisis no se realiza automáticamente, es más vulnerable a los cambios en el texto JSON que está analizando (quizás estoy equivocado al respecto).
  3. Escribir código para analizar JSON a través de un analizador de flujo es feo y tedioso.
+1

No estoy de acuerdo con el n. ° 2. Si la estructura de JSON cambia de manera inesperada, sin embargo, no tienes suerte. –

+0

No es cierto en ciertos casos ... por ejemplo, agregar un objeto como un valor en otro objeto. A menos que lo planee en el analizador de extracción, lo descartará, mientras que con JSONObject, simplemente funcionará. Por ejemplo: Cambiar { "nombre apellido": "Adán", "apellidos": "Olsen" } a { "nombre apellido": "Adán, " last_name: "Olsen", "numeros_telefono": { "casa": "555-867-5309", "trabajo": "888-555-5555" }} tiraría su analizador de lograr en un bucle como: while (analizador .nextToken()! = JsonToken.END_OBJECT) - Al final terminarás golpeando END_OBJECT, donde JSONObject lo analizaría bien. – synic

+0

Es posible escribir un analizador de flujo que cubra eso. Creo que esto es lo que shipChildren (http://jackson.codehaus.org/1.5.0/javadoc/org/codehaus/jackson/JsonParser.html#skipChildren%28%29) es para. –

Respuesta

2

Supongo que has respondido bastante a tu propia pregunta. :)
Usando el analizador JSON integrado y nunca he buscado una alternativa.

EDITAR: Ahora estoy usando una envoltura delgada basada en anotación de DroidParts.

2

Creo que la pregunta es si el built-in one es lo suficientemente bueno. Si lo es, seguro, minimizar las dependencias suele ser una buena estrategia. Lo suficientemente bueno puede referirse tanto a la eficiencia como a la facilidad de uso.

Por lo que vale, Jackson también tiene un modelo de árbol decente, así como el enlace de datos completo. El modelo de árbol es significativamente más rápido que el analizador predeterminado (el análisis es 3x-5x más rápido en J2SE, probablemente de manera similar en otras plataformas como Android, el modelo de árbol en sí mismo es probablemente más eficiente también). O bien: si no desea la dependencia del segundo jar (se necesita el mapeador para el modelo de árbol y el enlace de datos), también es sencillo escribir su propio árbol para cubrir sus casos de uso. O utilice HashMap/ArrayList/wrappers básicos, o tenga sus propias clases, si lo prefiere. El constructor tendría unas 40 líneas de código máximo.

6

También estoy usando el analizador JSON integrado en la mayoría de los casos, pero recientemente ingresé a un escenario en el que no encaja: Para algunas solicitudes de servicios web, recibo documentos JSON de más de 1 MB. Cargarlos con el analizador JSON incorporado requiere una gran cantidad de memoria principal y dio como resultado OutOfMemoryException varias veces. Para estos escenarios, un analizador de transmisión es la mejor opción (aunque es más incómodo en uso) y el analizador JSON incorporado no proporciona transmisión, sino solo el estilo DOM.

Para cualquiera que esté buscando un analizador JSON de transmisión para Android, recomiendo utilizar Google's GSON. Intenté con Jackson JSON al principio y funcionó bien hasta que intenté construir la versión de lanzamiento de mi aplicación: ProGuard informó varios problemas y la aplicación en ejecución se bloqueó con el misterioso NullPointerException en el constructor de Jackson ObjectMapper (aunque todo funcionó bien en la depuración versión). Incluso después de algunas horas de pruebas, no pude arreglar esto. Luego cambié a GSON y todo funcionó como un amuleto.

BTW: El tarro GSON de solo transmisión tiene un tamaño de solo 14kB, así que no hay nada de qué preocuparse realmente.

+1

Resulta que hay una forma de crear contenido de ProGuard; mi compañero de trabajo lo descubrió. Espero convencerlo de bloguear sobre los detalles, ya que desafortunadamente no es de una sola línea. Fundamentalmente, la debilidad de ProGuard es que se basa en el análisis estático, que se ve en problemas con la reflexión. Una cosa a tener en cuenta es que si solo usamos las funciones de transmisión de Jackson (JsonParser, JsonGenerator) desde el núcleo del tarro, no debería haber problemas. Es una parte del mapeador que usa la reflexión en gran medida. – StaxMan

+0

¿Te importaría indicar los usos que se han ejecutado en el problema NullPointerException en la dirección general de la solución si debemos usar el asignador? – kwogger

+0

Como mencioné en mi publicación, no he encontrado una solución para 'NullPointerException'. Es por eso que me he cambiado a GSON. – sven