Fastjson 默认不支持直接解析带泛型通配符(如 Result<? extends BaseDto>)的响应体,因Java类型擦除导致运行时无法获取真实泛型参数;需显式传入具体类型,如用 TypeReference<Result<UserDto>>() {} 或 ParameterizedTypeImpl 指定实际子类,避免使用 Result.class 或非法语法 Result<? extends BaseDto>.class,否则 data 字段将被解析为 JSONObject 而丢失类型信息。
` 怎么解析">
Fastjson 默认不支持直接解析带泛型通配符(如 Result<? extends BaseDto>)的响应体,因为 Java 的类型擦除机制导致运行时无法获取真实的泛型参数类型。但可以通过手动传入具体的泛型类型信息来解决。
这是最常用也最可靠的方式:不要依赖原始类的模糊声明,而是告诉 Fastjson “这里实际装的是哪个子类”。例如,若接口返回的是 Result<UserDto>,就用 UserDto.class 构造泛型类型:
TypeReference(推荐):String json = "{"code":200,"data":{"id":1,"name":"Alice"}}";Result<UserDto> result = JSON.parseObject(json, new TypeReference<Result<UserDto>>() {});
ParameterizedTypeImpl(适用于动态场景):Type type = new ParameterizedTypeImpl(Result.class, new Class[]{UserDto.class});Result<UserDto> result = JSON.parseObject(json, type);
不能写成 JSON.parseObject(json, Result.class) 或 Result<? extends BaseDto>.class —— 后者语法非法,前者会导致 data 字段被解析为 JSONObject 或 LinkedHashMap,丢失类型信息。Fastjson 不会自动推断通配符背后的真正子类。
确保 Result<T> 类中泛型字段 T data 能被正确识别:
立即学习“Java免费学习笔记(深入)”;
Result 类中,data 字段建议用泛型声明,并加注解增强可读性:public class Result<T> { private int code; private String msg; @JSONField(name = "data") private T data; // getter/setter}
BaseDto 有多个子类且响应结构一致,可考虑在反序列化前根据 code 或其他字段判断应使用的子类型,再选择对应 TypeReference。Fastjson2 对泛型解析做了优化,对常见泛型嵌套的支持更鲁棒。若项目允许,建议迁移并使用其新版 API:
import com.alibaba.fastjson2.JSON;Result<UserDto> r = JSON.parseObject(json, new TypeReference<Result<UserDto>>() {});