Как изменить 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 ответа:
JsonNode
является неизменяемым и предназначен для работы синтаксического анализа. Тем не менее, он может быть брошен вObjectNode
(иArrayNode
), которые позволяют мутаций:((ObjectNode)jsonNode).put("value", "NO");
для массива можно использовать:
((ObjectNode)jsonNode).putArray("arrayName").add(object.getValue());
вам нужно
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"); } }