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

使用Jackson库编辑JSON数组:修改嵌套字段B4的技术问询

没问题,我来教你用Jackson修改这个JSON里A8下的B4数组!先把你的目标JSON结构清晰列出来:

{ 
  "A1":"1234", 
  "A2": "123", 
  "A3": "???", 
  "A4": "object, may not be populated.", 
  "A5": { }, 
  "A6": { }, 
  "A7":{ 
    "B1": ["100"], 
    "B2": ["C"], 
    "B3": ["O", "A"] 
  }, 
  "A8":{ 
    "B4":["D1"], 
    "B5":["D2"], 
    "B6":["D3"], 
    "B7":["D4"], 
    "B8":["D5"], 
    "B9":["D6"], 
    "B10":["123"] 
  }, 
  "ignoreThisField": "it is useless" 
}

Jackson提供了两种常用的方式来修改JSON,我都给你列出来,你可以根据自己的场景选:

方式一:用树形API(适合JSON结构不固定的场景)

这种方式不需要定义POJO类,直接操作JSON节点,灵活性很高。因为Jackson默认解析出来的JsonNode是不可变的,所以我们要转换成ObjectNode来做修改:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;

public class JsonModifier {
    public static void main(String[] args) throws IOException {
        // 读取JSON文件到byte数组(你的readJson方法已经实现)
        byte[] jsonData = readJson(JsonFilePath);
        
        ObjectMapper objectMapper = new ObjectMapper();
        // 解析为可变的ObjectNode
        ObjectNode rootNode = (ObjectNode) objectMapper.readTree(jsonData);
        
        // 获取A8节点,判断是否存在
        ObjectNode a8Node = (ObjectNode) rootNode.get("A8");
        if (a8Node != null) {
            // 获取B4的数组节点
            ArrayNode b4Array = (ArrayNode) a8Node.get("B4");
            
            if (b4Array != null) {
                // 示例1:修改数组里的第一个元素
                if (b4Array.size() > 0) {
                    b4Array.set(0, objectMapper.valueToTree("updated_D1"));
                }
                
                // 示例2:清空原有元素,添加新元素
                // b4Array.removeAll();
                // b4Array.add("new_D1");
                // b4Array.add("new_D1_2");
            } else {
                // 如果B4不存在,创建新的数组并添加到A8
                ArrayNode newB4Array = objectMapper.createArrayNode();
                newB4Array.add("default_D1");
                a8Node.set("B4", newB4Array);
            }
        }
        
        // 可选:移除无用的ignoreThisField字段
        rootNode.remove("ignoreThisField");
        
        // 把修改后的JSON转换成格式化的字符串
        String updatedJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode);
        System.out.println(updatedJson);
        
        // 或者转换成byte数组用于后续操作
        // byte[] updatedJsonBytes = objectMapper.writeValueAsBytes(rootNode);
    }
    
    // 假设你的readJson方法实现如下
    private static byte[] readJson(String jsonFilePath) {
        // 这里写你的文件读取逻辑,比如用Files.readAllBytes
        return new byte[0];
    }
}

方式二:用POJO映射(适合JSON结构固定的场景)

如果你的JSON结构比较稳定,定义对应的POJO类会更类型安全,操作起来也更直观:

首先定义POJO类:

import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.List;

class Root {
    private String A1;
    private String A2;
    private String A3;
    private String A4;
    private Object A5;
    private Object A6;
    private A7 A7;
    private A8 A8;
    
    // 忽略不需要的字段
    @JsonIgnore
    private String ignoreThisField;

    // 生成所有字段的getter和setter方法
    public String getA1() { return A1; }
    public void setA1(String A1) { this.A1 = A1; }
    public String getA2() { return A2; }
    public void setA2(String A2) { this.A2 = A2; }
    public String getA3() { return A3; }
    public void setA3(String A3) { this.A3 = A3; }
    public String getA4() { return A4; }
    public void setA4(String A4) { this.A4 = A4; }
    public Object getA5() { return A5; }
    public void setA5(Object A5) { this.A5 = A5; }
    public Object getA6() { return A6; }
    public void setA6(Object A6) { this.A6 = A6; }
    public A7 getA7() { return A7; }
    public void setA7(A7 A7) { this.A7 = A7; }
    public A8 getA8() { return A8; }
    public void setA8(A8 A8) { this.A8 = A8; }
}

class A7 {
    private List<String> B1;
    private List<String> B2;
    private List<String> B3;

    // getter和setter
    public List<String> getB1() { return B1; }
    public void setB1(List<String> B1) { this.B1 = B1; }
    public List<String> getB2() { return B2; }
    public void setB2(List<String> B2) { this.B2 = B2; }
    public List<String> getB3() { return B3; }
    public void setB3(List<String> B3) { this.B3 = B3; }
}

class A8 {
    private List<String> B4;
    private List<String> B5;
    private List<String> B6;
    private List<String> B7;
    private List<String> B8;
    private List<String> B9;
    private List<String> B10;

    // getter和setter
    public List<String> getB4() { return B4; }
    public void setB4(List<String> B4) { this.B4 = B4; }
    public List<String> getB5() { return B5; }
    public void setB5(List<String> B5) { this.B5 = B5; }
    public List<String> getB6() { return B6; }
    public void setB6(List<String> B6) { this.B6 = B6; }
    public List<String> getB7() { return B7; }
    public void setB7(List<String> B7) { this.B7 = B7; }
    public List<String> getB8() { return B8; }
    public void setB8(List<String> B8) { this.B8 = B8; }
    public List<String> getB9() { return B9; }
    public void setB9(List<String> B9) { this.B9 = B9; }
    public List<String> getB10() { return B10; }
    public void setB10(List<String> B10) { this.B10 = B10; }
}

然后编写修改逻辑:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class PojoJsonModifier {
    public static void main(String[] args) throws IOException {
        byte[] jsonData = readJson(JsonFilePath);
        ObjectMapper objectMapper = new ObjectMapper();
        
        // 反序列化成Root对象
        Root root = objectMapper.readValue(jsonData, Root.class);
        
        if (root.getA8() != null) {
            List<String> b4List = root.getA8().getB4();
            if (b4List != null) {
                // 修改第一个元素
                if (!b4List.isEmpty()) {
                    b4List.set(0, "updated_D1");
                }
                // 或者添加新元素
                // b4List.add("extra_D1");
            } else {
                // 如果B4为null,初始化一个新列表
                b4List = new ArrayList<>();
                b4List.add("default_D1");
                root.getA8().setB4(b4List);
            }
        }
        
        // 序列化回JSON字符串
        String updatedJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(root);
        System.out.println(updatedJson);
    }
    
    private static byte[] readJson(String jsonFilePath) {
        // 你的文件读取逻辑
        return new byte[0];
    }
}

两种方式各有优缺点:树形API灵活,不用写POJO,适合结构多变的JSON;POJO方式类型安全,代码可读性高,适合结构固定的场景,你可以根据自己的需求选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:04:38