172 votes

Jackson comment transformer JsonNode en ArrayNode sans casting ?

Je change ma bibliothèque JSON de org.json à Jackson et je veux migrer le code suivant :

JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray =  datasets.getJSONArray("datasets");

Maintenant, à Jackson, j'ai les éléments suivants :

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 la possibilité d'une ClassCastException ? Existe-t-il une méthode équivalente à getJSONArray en org.json pour que je puisse gérer correctement les erreurs au cas où ce ne serait pas un tableau ?

322voto

Perception Points 42290

Oui, la conception de l'analyseur manuel de Jackson est assez différente de celle des autres bibliothèques. En particulier, vous remarquerez que JsonNode possède la plupart des fonctions que vous associez généralement aux nœuds de tableau d'autres API. En tant que tel, vous n'avez pas besoin d'effectuer un cast vers un tableau ArrayNode à utiliser. Voici un exemple :

JSON :

{
    "objects" : ["One", "Two", "Three"]
}

Code :

final String json = "{\"objects\" : [\"One\", \"Two\", \"Three\"]}";

final JsonNode arrNode = new ObjectMapper().readTree(json).get("objects");
if (arrNode.isArray()) {
    for (final JsonNode objNode : arrNode) {
        System.out.println(objNode);
    }
}

Sortie :

"Un"
"Deux"
"Trois"

Notez l'utilisation de isArray pour vérifier que le nœud est bien un tableau avant d'itérer. Cette vérification n'est pas nécessaire si vous êtes absolument sûr de 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).

28voto

Leif Ericson Points 1535

En Java 8, vous pouvez le faire comme suit :

import java.util.*;
import java.util.stream.*;

List<JsonNode> datasets = StreamSupport
    .stream(obj.get("datasets").spliterator(), false)
    .collect(Collectors.toList())

5voto

Wildhammer Points 132

Je suppose qu'à la fin de la journée vous voulez consommer les données dans le ArrayNode en les itérant. Pour cela :

Iterator<JsonNode> iterator = datasets.withArray("datasets").elements();
while (iterator.hasNext()) 
        System.out.print(iterator.next().toString() + " "); 

ou si vous aimez les flux et les fonctions lambda :

import com.google.common.collect.Streams;
Streams.stream(datasets.withArray("datasets").elements())
    .forEach( item -> System.out.print(item.toString()) )

3voto

ucMedia Points 1266

Obtenez un itérateur en appelant la méthode de calcul de l'itérateur de JsonNode. iterator() méthode, et continuez...

  JsonNode array = datasets.get("datasets");

  if (array.isArray()) {
      Iterator<JsonNode> itr = array.iterator();
      /* Set up a loop that makes a call to hasNext().
      Have the loop iterate as long as hasNext() returns true.*/
      while (itr.hasNext()) {
          JsonNode item=itr.next();
          // do something with array elements
      }
  }

1voto

Stephen C Points 255558

Existe-t-il une méthode équivalente à getJSONArray dans org.json pour que je puisse gérer correctement les erreurs au cas où ce ne serait pas un tableau ?

Cela dépend de votre entrée, c'est-à-dire des éléments que vous récupérez à partir de l'URL. Si la valeur de l'attribut "datasets" est un tableau associatif plutôt qu'un simple tableau, vous obtiendrez un message de type ClassCastException .

Mais là encore, la justesse de votre ancienne version également dépend de l'entrée. Dans la situation où votre nouvelle version jette une erreur de type ClassCastException l'ancienne version lancera JSONException . Référence : http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X