55 votes

Jackson JSON : obtenir le nom du nœud à partir de json-tree

Comment puis-je recevoir les noms de nœuds d'une arborescence JSON à l'aide de Jackson ? Le fichier JSON ressemble à ceci :

 {  
    node1:"value1",
    node2:"value2",
    node3:{  
        node3.1:"value3.1",
        node3.2:"value3.2"
    }
}

j'ai

 JsonNode rootNode = mapper.readTree(fileReader);

et besoin de quelque chose comme

 for (JsonNode node : rootNode){
    if (node.getName().equals("foo"){
        //bar
  }
}

Merci.

79voto

Supun Sameera Points 818

Pour Jackson 2+ ( com.fasterxml.jackson ), les méthodes sont un peu différentes :

 Iterator<Entry<String, JsonNode>> nodes = rootNode.get("foo").fields();

while (nodes.hasNext()) {
  Map.Entry<String, JsonNode> entry = (Map.Entry<String, JsonNode>) nodes.next();

  logger.info("key --> " + entry.getKey() + " value-->" + entry.getValue());
}

14voto

Anna Shekhawat Points 171

field() et fieldNames() ne fonctionnaient pas tous les deux pour moi. Et j'ai dû passer pas mal de temps pour trouver un moyen d'itérer sur les touches. Il y a deux façons de le faire.

L'un consiste à le convertir en une carte (prend plus de place):

 ObjectMapper mapper = new ObjectMapper();
Map<String, Object> result = mapper.convertValue(jsonNode, Map.class);
for (String key : result.keySet())
{
    if(key.equals(foo))
    {
        //code here
    }
}

Un autre, en utilisant un itérateur de chaîne :

 Iterator<String> it = jsonNode.getFieldNames();
while (it.hasNext())
{
    String key = it.next();
    if (key.equals(foo))
    {
         //code here
    }
}

11voto

ChrisGeo Points 1640

Clarification ici :

Alors que cela fonctionnera:

  JsonNode rootNode = objectMapper.readTree(file);
 Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
 while (fields.hasNext()) {
    Map.Entry<String, JsonNode> entry = fields.next();
    log.info(entry.getKey() + ":" + entry.getValue())
 }

Cela ne va pas :

 JsonNode rootNode = objectMapper.readTree(file);

while (rootNode.fields().hasNext()) {
    Map.Entry<String, JsonNode> entry = rootNode.fields().next();
    log.info(entry.getKey() + ":" + entry.getValue())
}

Veillez donc à déclarer le Iterator tant que variable et utilisez-le.

Assurez-vous d'utiliser la fasterxml plutôt que codehaus .

8voto

nash Points 81
JsonNode root = mapper.readTree(json);
root.at("/some-node").fields().forEachRemaining(e -> {
                              System.out.println(e.getKey()+"---"+ e.getValue());

        });

En une seule ligne Jackson 2+

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