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

使用jackson-databind ObjectMapper将含数字键隐式列表的JSON转为Java对象

解答

结论

可以实现,但无法直接反序列化,因为原JSON中Package数据是以数字为键的独立对象结构,并非标准数组结构,额外配置Jackson的反序列化规则即可满足需求。

推荐实现方案

1. 定义实体类

首先定义Package实体(注意避开JDK自带的java.lang.Package类,建议重命名为PackageInfo避免冲突):

public class PackageInfo {
    private String packageCode;
    private String packageNum;
    // 此处省略无参构造、getter、setter方法
}

然后定义目标响应实体,通过@JsonAnySetter注解收集所有数字键对应的Package对象:

public class ApiResponse {
    private String message;
    // 用List接收更方便,也可以直接定义为PackageInfo[]类型
    private List<PackageInfo> packages = new ArrayList<>();

    // 标准getter、setter
    public String getMessage() { return message; }
    public void setMessage(String message) { this.message = message; }
    public List<PackageInfo> getPackages() { return packages; }
    public void setPackages(List<PackageInfo> packages) { this.packages = packages; }

    // 所有无法匹配到已知属性的键值对会进入该方法
    @JsonAnySetter
    public void addPackage(String key, PackageInfo pkg) {
        // 只处理数字键的字段,过滤异常字段
        if (key.matches("\\d+")) {
            this.packages.add(pkg);
        }
    }
}

2. 反序列化调用

直接用常规的ObjectMapper调用即可:

ObjectMapper objectMapper = new ObjectMapper();
ApiResponse response = objectMapper.readValue(yourJsonStr, ApiResponse.class);
// 如需数组,直接调用packages.toArray(new PackageInfo[0])转换即可

其他可选方案

如果不想修改实体类,可以自定义JsonDeserializer<ApiResponse>反序列化器,在反序列化逻辑中手动解析JSON节点,将数字键对应的节点收集为数组赋值给packages属性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:45:01