Comment modifier JsonNode en Java?


109

J'ai besoin de changer la valeur d'un attribut JSON en Java, je peux obtenir la valeur correctement mais je n'ai pas pu 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?


1
Vous pouvez convertir le JsonNode en une carte Java, par exemple le resultMap = mapper.convertValue(aJsonNode, Map.class);modifier dans la carte, puis changer cette carte en un JsonNode. Juste dire.
MikeJRamsey56

Réponses:


195

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

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

Pour un tableau, vous pouvez utiliser:

((ObjectNode)jsonNode).putArray("arrayName").add(object.ge‌​tValue());

4
essayé pour un type numérique dans lequel je dois changer la valeur. J'ai cette exception:Exception in thread "main" java.lang.ClassCastException: com.fasterxml.jackson.databind.node.IntNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode
balboa_21

Vous devez essayer "IntNode"
mulya

6

En ajoutant une réponse, car 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 à effectuer un putremplacement effectif du nœud entier, quel que soit le type de nœud d'origine.

Si vous avez besoin de "modifier" le nœud en utilisant la valeur existante du nœud:

  1. get la valeur / le tableau du JsonNode
  2. Effectuez votre modification sur cette valeur / tableau
  3. Continuez à appeler putle parent.

Code, dont le but est de modifier subfield, qui est le nœud enfant de NodeAet 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 d' ici , grâce à wassgreen @


5

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

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

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

4

Je pense que vous pouvez simplement convertir ObjectNode et utiliser la putméthode. Comme ça

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


2

Vous devez obtenir ObjectNodeun objet de type pour définir des valeurs. Jetez un œil à ceci


0

Juste pour comprendre les autres qui peuvent ne pas avoir une vue d'ensemble claire, le code suivant fonctionne pour moi pour trouver un champ, puis le mettre à jour

ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(JsonString);    
JsonPointer valueNodePointer = JsonPointer.compile("/GrandObj/Obj/field");
JsonPointer containerPointer = valueNodePointer.head();
JsonNode parentJsonNode = rootNode.at(containerPointer);

if (!parentJsonNode.isMissingNode() && parentJsonNode.isObject()) {
    ObjectNode parentObjectNode = (ObjectNode) parentJsonNode;
    //following will give you just the field name. 
    //e.g. if pointer is /grandObject/Object/field
    //JsonPoint.last() will give you /field 
    //remember to take out the / character 
    String fieldName = valueNodePointer.last().toString();
    fieldName = fieldName.replace(Character.toString(JsonPointer.SEPARATOR), StringUtils.EMPTY);
    JsonNode fieldValueNode = parentObjectNode.get(fieldName);

    if(fieldValueNode != null) {
        parentObjectNode.put(fieldName, "NewValue");
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.