web-dev-qa-db-fra.com

Comment modifier JsonNode en Java?

Je dois modifier la valeur d'un attribut JSON en Java. Je peux obtenir la valeur correctement mais je ne peux pas modifier le JSON.

voici le code ci-dessous 

  JsonNode blablas = mapper.readTree(parser).get("blablas");
    for (JsonNode jsonNode : blablas) {
        String elementId = jsonNode.get("element").asText();
        String value = jsonNode.get("value").asText();
        if (StringUtils.equalsIgnoreCase(elementId, "blabla")) {
            if(value != null && value.equals("YES")){
                 // I need to change the node to NO then save it into the JSON
            }
        }
    }

Quelle est la meilleure façon de procéder?

67
mstfdz

JsonNode est immuable et est destiné à une opération d'analyse. Cependant, il peut être converti en ObjectNode (et ArrayNode) qui autorisent les mutations:

((ObjectNode)jsonNode).put("value", "NO");

Pour un tableau, vous pouvez utiliser:

((ObjectNode)jsonNode).putArray("arrayName").add(object.ge‌​tValue());
136
Sharon Ben Asher

Je pense que vous pouvez simplement transtyper en ObjectNode et utiliser la méthode put. Comme ça 

ObjectNode o = (ObjectNode) jsonNode; o.put("value", "NO");

2
Xdsasdf

Vous devez obtenir un objet de type ObjectNode pour pouvoir définir des valeurs . Regardez this

1
Eugen Halca

En ajoutant une réponse comme d'autres l'ont voté dans les commentaires de la réponse acceptée, ils obtiennent cette exception lorsqu'ils tentent de convertir en ObjectNode (moi-même inclus):

Exception in thread "main" Java.lang.ClassCastException: 
com.fasterxml.jackson.databind.node.TextNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

La solution consiste à obtenir le nœud 'parent' et à exécuter une put, en remplaçant effectivement le nœud entier, quel que soit le type de nœud d'origine.

Si vous devez "modifier" le nœud en utilisant la valeur existante du nœud:

  1. get la valeur/tableau de la JsonNode
  2. Effectuez votre modification sur cette valeur/tableau
  3. Passez à appeler put sur le parent.

Code, où l'objectif est de modifier subfield, qui est le nœud enfant de NodeA et Node1:

JsonNode nodeParent = someNode.get("NodeA")
                .get("Node1");

// Manually modify value of 'subfield', can only be done using the parent.
((ObjectNode) nodeParent).put('subfield', "my-new-value-here");

Crédits:

J'ai eu cette inspiration de ici , grâce à wassgreen @

0
matrixanomaly

La réponse de @ Sharon-Ben-Asher est correcte.

Mais dans mon cas, pour un tableau, je dois utiliser:

((ArrayNode) jsonNode).add("value");
0
Alejandro