Estoy cambiando mi biblioteca JSON de org.json a Jackson y quiero migrar el siguiente código:
JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray = datasets.getJSONArray("datasets");
Ahora en Jackson tengo lo siguiente:
ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");
Sin embargo, no me gusta el elenco allí, ¿existe la posibilidad de un ClassCastException
? ¿Existe un método equivalente a getJSONArray
in org.json
para que tenga un manejo adecuado de errores en caso de que no sea una matriz?
FAIL_ON_UNKNOWN_PROPERTIES
función del deserializador para obtener valores nulos devueltos en los campos no utilizados. Pero, por supuesto, solo es una opción si el conjunto de nombres de campo es relativamente limitado.Respuestas:
Sí, el diseño del analizador manual de Jackson es bastante diferente al de otras bibliotecas. En particular, notará que
JsonNode
tiene la mayoría de las funciones que normalmente asociaría con los nodos de matriz de otras API. Como tal, no es necesario convertir a unArrayNode
uso. He aquí un ejemplo:JSON:
Código:
Salida:
Tenga en cuenta el uso de
isArray
para verificar que el nodo es realmente una matriz antes de iterar. La verificación no es necesaria si está absolutamente seguro de la estructura de sus datos, pero está disponible en caso de que la necesite (y esto no es diferente de la mayoría de las otras bibliotecas JSON).fuente
En Java 8 puedes hacerlo así:
fuente
Depende de su opinión; es decir, las cosas que obtiene de la URL. Si el valor del atributo "conjuntos de datos" es una matriz asociativa en lugar de una matriz simple, obtendrá un
ClassCastException
.Pero, de nuevo, la exactitud de su versión anterior también depende de la entrada. En la situación en la que su nueva versión arroje un
ClassCastException
, la versión anterior arrojaráJSONException
. Referencia: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)fuente
Asumiría al final del día que desea consumir los datos en el ArrayNode iterando. Para eso:
o si te gustan las transmisiones y las funciones lambda:
fuente