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

使用fasterXML/Jackson构造方法反序列化复杂JSON的问题

解决Jackson反序列化对象数组的问题

没问题,这事儿很容易解决,只需要调整你的实体类结构和构造方法的参数类型就行,具体操作如下:

1. 创建对应子对象的POJO类

首先,你需要新建一个类来映射JSON中blargs数组里的每个对象(比如{"fooId":888,"barVal":"tacos"}这种结构),我们就叫它FooBarItem:

public class FooBarItem {
    private Integer fooId;
    private String barVal;

    // 使用@JsonCreator配合@JsonProperty指定构造参数对应的JSON字段
    @JsonCreator
    public FooBarItem(@JsonProperty("fooId") Integer fooId, @JsonProperty("barVal") String barVal) {
        this.fooId = fooId;
        this.barVal = barVal;
    }

    // 可选:添加getter方法方便后续获取属性值
    public Integer getFooId() {
        return fooId;
    }

    public String getBarVal() {
        return barVal;
    }
}

2. 修改原FooBar类的构造方法参数类型

把原来FooBar类中构造方法的List<String>替换成List<FooBarItem>,保持注解配置不变:

public class FooBar {
    private List<FooBarItem> xyz;

    @JsonCreator
    public FooBar(@JsonProperty("blargs") List<FooBarItem> xyz) {
        this.xyz = xyz;
    }

    // 可选:添加getter方法
    public List<FooBarItem> getXyz() {
        return xyz;
    }
}

3. 测试反序列化

现在你就可以用Jackson正常解析新的JSON结构了,示例代码如下:

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        // 你的目标JSON字符串
        String json = "{\"blargs\":[{\"fooId\":888,\"barVal\":\"tacos\"},{\"fooId\":999,\"barVal\":\"burritos\"}]}";
        
        FooBar fooBar = objectMapper.readValue(json, FooBar.class);
        
        // 遍历验证结果
        for (FooBarItem item : fooBar.getXyz()) {
            System.out.println("fooId: " + item.getFooId() + ", barVal: " + item.getBarVal());
        }
    }
}

额外说明

如果你更倾向于使用可变对象,也可以给FooBarItem添加无参构造方法和对应的setter方法,Jackson会自动完成字段映射,不需要@JsonCreator注解——不过用构造方法的方式更符合不可变对象设计的最佳实践,能避免后续意外修改属性值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:39:43