You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JsonNode转ObjectNode设置值触发类型转换异常,求问题排查

问题原因与解决办法

核心问题

你的JSON结构里,MyObject的value字段是原始数据类型(字符串、数字、布尔值),比如"name"对应的value是字符串"Random name"——Jackson解析这类值时,会生成对应的节点实例:字符串对应TextNode、数字对应IntNode、布尔值对应BooleanNode。而ObjectNode是用来表示JSON对象(即{...}包裹的键值对结构)的,两者完全不是一个类型,强行转换必然抛出ClassCastException。

你错误地误以为value是一个嵌套的JSON对象(包含value子字段),所以才会尝试转成ObjectNode去调用put方法,这完全不符合你的实际JSON结构。

正确修改方式

因为MyObject的value本身就是你要修改的目标值,直接替换这个JsonNode实例即可:

// 先确保MyObject有对应的setValue方法
for(MyObject myObject : array) {
    // 把常量放前面,避免getFieldId为null时触发空指针
    if("name".equals(myObject.getFieldId())) {
        myObject.setValue(TextNode.valueOf("new name"));
    }
}

如果需要更通用的方式(比如支持任意类型的value),可以用ObjectMapper来生成对应节点:

ObjectMapper mapper = new ObjectMapper();
for(MyObject myObject : array) {
    if("name".equals(myObject.getFieldId())) {
        myObject.setValue(mapper.valueToTree("new name"));
    }
}

额外注意

  • 确认你的MyObject类已经定义了setValue方法(你只贴了字段,没贴getter/setter,这是Java实体类的基本要求)。
  • 尽量把常量字符串放在equals方法的前面,避免当getFieldId()返回null时抛出NullPointerException。

内容的提问来源于stack exchange,提问作者Raccoon21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:33:24