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

如何使用Java Jackson更新JSON数组中指定元素的属性

使用Jackson修改JSON数组中指定元素的字段值

你遇到的错误是因为firetvs是数组类型(ArrayNode),而with()方法仅适用于对象类型(ObjectNode),直接调用objectNode.with("firetvs")会触发类型不匹配的报错。正确的做法是先获取数组节点,再遍历其中的元素找到目标对象修改字段。

实现步骤

  1. 从根ObjectNode中获取firetvs对应的ArrayNode节点;
  2. 遍历数组中的每个元素,判断元素是否为ObjectNode;
  3. 检查元素的name字段值是否为"mbr",匹配则更新其mac字段。

完整代码示例

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class JacksonJsonUpdate {
    public static void main(String[] args) throws Exception {
        // 示例JSON内容
        String originalJson = "{\n" +
                "  \"lastUpdated\": \"2024-05-20T10:30:00\",\n" +
                "  \"firetvs\": [\n" +
                "    {\n" +
                "      \"name\": \"mbr\",\n" +
                "      \"ip\": \"192.168.0.5\",\n" +
                "      \"mac\": \"XX:XX:XX:XX:XX:XX\",\n" +
                "      \"token\": \"abc123\"\n" +
                "    },\n" +
                "    {\n" +
                "      \"name\": \"living\",\n" +
                "      \"ip\": \"192.168.0.6\",\n" +
                "      \"mac\": \"YY:YY:YY:YY:YY:YY\",\n" +
                "      \"token\": \"def456\"\n" +
                "    }\n" +
                "  ]\n" +
                "}";

        ObjectMapper mapper = new ObjectMapper();
        // 解析JSON为根ObjectNode
        ObjectNode rootNode = (ObjectNode) mapper.readTree(originalJson);

        // 获取firetvs数组节点(withArray方法更安全,不存在则创建空数组)
        ArrayNode firetvsArray = rootNode.withArray("firetvs");

        // 遍历数组找目标元素
        for (JsonNode item : firetvsArray) {
            if (item instanceof ObjectNode) {
                ObjectNode deviceNode = (ObjectNode) item;
                // 匹配name为"mbr"的元素
                if ("mbr".equals(deviceNode.get("name").asText())) {
                    // 更新mac字段
                    deviceNode.put("mac", "C1:41:Q4:E8:S1:98:V1");
                    // 若只需修改第一个匹配项,可在此处添加break终止循环
                    break;
                }
            }
        }

        // 输出修改后的JSON
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode));
    }
}

关键说明

  • rootNode.withArray("firetvs"):专门用于获取或创建数组节点,避免了手动强转的类型风险;
  • 遍历数组时需先判断元素类型为ObjectNode,防止非对象元素导致的转换错误;
  • 找到匹配元素后,直接用put()方法覆盖mac字段值即可完成修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:26:21