readtree node jsonnode example create java json jackson

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:

  1. get el valor / matriz de JsonNode
  2. Realice su modificación en ese valor / matriz
  3. 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.ge‌​tValue());


ObjectNode obtener ObjectNode objeto de tipo ObjectNode para establecer valores. Mira this