jackson 如何在Java中修改JsonNode?

twh00eeo  于 2022-11-08  发布在  Java
关注(0)|答案(7)|浏览(410)

我需要在Java中更改JSON属性的值,我可以正确地获得该值,但我无法修改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
            }
        }
    }

最好的方法是什么?

3z6pesqy

3z6pesqy1#

JsonNode是不可变的,用于解析操作。但是,它可以转换为允许变化的ObjectNode(和ArrayNode):

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

对于数组,您可以用途:

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

smdnsysy2#

添加一个答案,因为其他一些人在已接受答案的注解中进行了向上投票,他们在尝试强制转换为ObjectNode时会遇到此异常(包括我自己):

Exception in thread "main" java.lang.ClassCastException: 
com.fasterxml.jackson.databind.node.TextNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

解决方案是获取“父”节点,并执行put,从而有效地替换整个节点,而不管原始节点类型如何。

如果需要使用节点的现有值“修改”节点:

  1. get返回JsonNode的值/数组
    1.对该值/数组执行修改
    1.继续在父级上调用put
    代码,其中目标是修改subfield,它是NodeANode1的子节点:
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");
  • 制作人员:*

我从here得到了这个灵感,这要感谢wassgreen@

zfycwa2u

zfycwa2u3#

我认为您可以只强制转换为ObjectNode并使用put方法。
ObjectNode o = (ObjectNode) jsonNode; o.put("value", "NO");

bvhaajcl

bvhaajcl4#

“Sharon-Ben-Asher”的答案是可以的。
但在我的例子中,对于数组,我必须用途:

((ArrayNode) jsonNode).add("value");
tnkciper

tnkciper5#

你需要获取ObjectNode类型的对象来设置值。

9q78igpj

9q78igpj6#

只是为了理解其他人谁可能没有得到整个图片清楚以下代码工程为我找到一个字段,然后更新它

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

yfwxisqw7#

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> nodeMap = mapper.convertValue(jsonNode, new TypeReference<Map<String, Object>>(){});
nodeMap.put("key", "value");
jsonNode = mapper.convertValue(nodeMap, JsonNode.class);

相关问题