如何使用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
相关产品推荐
相关产品推荐

