Как изменить JsonNode в Java?


Мне нужно изменить значение атрибута JSON в Java, я могу получить значение правильно, но я не мог изменить JSON.

вот код ниже

  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
            }
        }
    }

каков наилучший способ сделать это?

4 62

4 ответа:

JsonNode является неизменяемым и предназначен для работы синтаксического анализа. Тем не менее, он может быть брошен в ObjectNodeArrayNode), которые позволяют мутаций:

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

для массива можно использовать:

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

вам нужно ObjectNode введите объект для установки значений. Взгляните на этой

Я думаю, что вы можете просто бросить ObjectNode и использовать put метод. Вот так

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

просто ради понимания других, кто не может получить всю картину ясно следующий код работает для меня, чтобы найти поле, а затем обновить его

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");
    }
}