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

如何使用Jackson将目标JSON转换为Person[]泛型数组?

解决JSON反序列化为Person[]的问题

你遇到的返回HashMap而非Person对象的问题,根源是Java泛型的类型擦除——Jackson在运行时无法得知Wrapper<T>中T的实际类型是Person,只能默认用HashMap来反序列化数组里的对象。下面给你两种可行的解决方法:

方法一:修正泛型Wrapper的使用方式

保留Wrapper类,但读取时要通过TypeReference明确指定泛型的具体类型,让Jackson知道要反序列化为Wrapper<Person>:

首先确保Wrapper类有完整的getter/setter(或者用Lombok的@Data注解简化):

class Wrapper<T> {
    private int num;
    private T[] res;

    // 生成getter和setter方法
    public int getNum() { return num; }
    public void setNum(int num) { this.num = num; }
    public T[] getRes() { return res; }
    public void setRes(T[] res) { this.res = res; }
}

然后用TypeReference来读取JSON:

ObjectMapper mapper = new ObjectMapper();
Wrapper<Person> wrapper = mapper.readValue(reqString, new TypeReference<Wrapper<Person>>() {});
Person[] personArray = wrapper.getRes();

方法二:直接提取"res"字段反序列化(更简便)

既然你只关心"res"数组,完全可以跳过Wrapper,直接定位到该字段再反序列化:

方式1:先解析为JsonNode再转换

ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(reqString);
JsonNode resNode = rootNode.get("res");
Person[] personArray = mapper.treeToValue(resNode, Person[].class);

方式2:直接指定路径读取

ObjectMapper mapper = new ObjectMapper();
// 直接读取整个JSON中的res字段对应的数组
Person[] personArray = mapper.readValue(
    mapper.readTree(reqString).at("/res").traverse(), 
    Person[].class
);

注意:你的Person类需要保证Jackson能访问到字段——要么把字段设为public,要么添加getter/setter,或者在类上添加@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)注解,让Jackson可以直接访问私有字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:45:43