java - example - jsonnode to object
¿Cómo modificar JsonNode en Java? (6)
Necesito cambiar el valor de un atributo JSON en Java, puedo obtener el valor correctamente pero no pude modificar el JSON.
aquí está el código a continuación
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
}
}
}
¿Cuál es la mejor manera de hacer esto?
Al agregar una respuesta como otros han votado en los comentarios de la respuesta aceptada, obtienen esta excepción al intentar enviar a ObjectNode (incluido yo mismo):
Exception in thread "main" java.lang.ClassCastException:
com.fasterxml.jackson.databind.node.TextNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode
La solución es obtener el nodo ''padre'' y realizar una
put
, reemplazando efectivamente el nodo completo, independientemente del tipo de nodo original.
Si necesita "modificar" el nodo utilizando el valor existente del nodo:
-
get
el valor / matriz deJsonNode
- Realice su modificación en ese valor / matriz
- Proceda a llamar a los padres.
Código, donde el objetivo es modificar el
subfield
, que es el nodo secundario del
NodeA
y el
NodeA
:
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éditos
wassgreen@ esta inspiración de here , gracias a wassgreen@
Creo que puedes enviar a ObjectNode y usar el método
put
.
Me gusta esto
ObjectNode o = (ObjectNode) jsonNode; o.put("value", "NO");
La respuesta de @ Sharon-Ben-Asher está bien.
Pero en mi caso, para una matriz tengo que usar:
((ArrayNode) jsonNode).add("value");
Solo por el bien de la comprensión de otros que pueden no tener la imagen completa, el siguiente código me funciona para encontrar un campo y luego actualizarlo
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");
}
}
JsonNode
es inmutable y está destinado a la operación de análisis.
Sin embargo, se puede convertir en
ObjectNode
(y
ArrayNode
) que permiten mutaciones:
((ObjectNode)jsonNode).put("value", "NO");
Para una matriz, puede usar:
((ObjectNode)jsonNode).putArray("arrayName").add(object.getValue());
ObjectNode
obtener
ObjectNode
objeto de tipo
ObjectNode
para establecer valores.
Mira
this