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 getJSONArrayin org.jsonpara que tenga un manejo adecuado de errores en caso de que no sea una matriz?

FAIL_ON_UNKNOWN_PROPERTIESfunció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
JsonNodetiene 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 unArrayNodeuso. He aquí un ejemplo:JSON:
Código:
Salida:
Tenga en cuenta el uso de
isArraypara 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