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?
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.getValue());
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");
Vous devez obtenir un objet de type ObjectNode
pour pouvoir définir des valeurs . Regardez this
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:
get
la valeur/tableau de la JsonNode
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 @
La réponse de @ Sharon-Ben-Asher est correcte.
Mais dans mon cas, pour un tableau, je dois utiliser:
((ArrayNode) jsonNode).add("value");