如何使用Java Jackson更新JSON数组中指定元素的属性
使用Jackson修改JSON数组中指定元素的字段值
你遇到的错误是因为firetvs是数组类型(ArrayNode),而with()方法仅适用于对象类型(ObjectNode),直接调用objectNode.with("firetvs")会触发类型不匹配的报错。正确的做法是先获取数组节点,再遍历其中的元素找到目标对象修改字段。
实现步骤
- 从根
ObjectNode中获取firetvs对应的ArrayNode节点; - 遍历数组中的每个元素,判断元素是否为
ObjectNode; - 检查元素的
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
相关产品推荐
相关产品推荐

