Je change ma bibliothèque JSON de org.json à Jackson et je souhaite migrer le code suivant:
JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray = datasets.getJSONArray("datasets");
Maintenant, à Jackson, j'ai ce qui suit:
ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");
Cependant je n'aime pas le casting là-bas, y a-t-il une possibilité pour un ClassCastException
? Existe-t-il une méthode équivalente à getJSONArray
in org.json
pour que je gère correctement les erreurs au cas où ce ne serait pas un tableau?
FAIL_ON_UNKNOWN_PROPERTIES
pour simplement obtenir les valeurs nulles renvoyées dans les champs inutilisés. Mais ce n'est bien sûr une option que si le jeu de noms de champ est relativement limité.Réponses:
Oui, la conception de l'analyseur manuel Jackson est assez différente des autres bibliothèques. En particulier, vous remarquerez qu'il
JsonNode
possède la plupart des fonctions que vous associeriez généralement aux nœuds de tableau d'autres API. En tant que tel, vous n'avez pas besoin de convertir en unArrayNode
pour l'utiliser. Voici un exemple:JSON:
Code:
Production:
Notez l'utilisation de
isArray
pour vérifier que le nœud est en fait un tableau avant l'itération. La vérification n'est pas nécessaire si vous êtes absolument confiant dans la structure de vos données, mais elle est disponible si vous en avez besoin (et ce n'est pas différent de la plupart des autres bibliothèques JSON).la source
Dans Java 8, vous pouvez le faire comme ceci:
la source
Cela dépend de votre contribution; c'est-à-dire ce que vous récupérez de l'URL Si la valeur de l'attribut "datasets" est un tableau associatif plutôt qu'un simple tableau, vous obtiendrez un
ClassCastException
.Mais là encore, l'exactitude de votre ancienne version dépend également de l'entrée. Dans le cas où votre nouvelle version lance un
ClassCastException
, l'ancienne version lanceraJSONException
. Référence: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)la source
Je suppose qu'à la fin de la journée, vous voulez consommer les données du ArrayNode en l'itérant. Pour ça:
ou si vous aimez les flux et les fonctions lambda:
la source