fastjson 默认不支持直接解析带泛型通配符(如 result

Fastjson 默认不支持直接解析带泛型通配符(如 Result extends BaseDto>)的响应体,因为 Java 的类型擦除机制导致运行时无法获取真实的泛型参数类型。但可以通过手动传入具体的泛型类型信息来解决。
明确指定实际泛型类型进行反序列化
这是最常用也最可靠的方式:不要依赖原始类的模糊声明,而是告诉 Fastjson “这里实际装的是哪个子类”。例如,若接口返回的是 Result<userdto></userdto>,就用 UserDto.class 构造泛型类型:
- 使用
TypeReference(推荐):
String json = "{\"code\":200,\"data\":{\"id\":1,\"name\":\"Alice\"}}";
Result<userdto> result = JSON.parseObject(json, new TypeReference<result>>() {});</result></userdto>
- 或用
ParameterizedTypeImpl(适用于动态场景):
Type type = new ParameterizedTypeImpl(Result.class, new Class[]{UserDto.class});
Result<userdto> result = JSON.parseObject(json, type);</userdto>
避免直接解析成 Result extends BaseDto>
不能写成 JSON.parseObject(json, Result.class) 或 Result extends BaseDto>.class —— 后者语法非法,前者会导致 data 字段被解析为 JSONObject 或 LinkedHashMap,丢失类型信息。Fastjson 不会自动推断通配符背后的真正子类。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
配合 @JSONField 注解控制字段映射
确保 Result<t></t> 类中泛型字段 T data 能被正确识别:
- 在
Result类中,data字段建议用泛型声明,并加注解增强可读性:
public class Result<t> {
private int code;
private String msg;
@JSONField(name = "data")
private T data;
// getter/setter
}</t>
- 如果
BaseDto有多个子类且响应结构一致,可考虑在反序列化前根据code或其他字段判断应使用的子类型,再选择对应TypeReference。
升级到 Fastjson2(更友好的泛型支持)
Fastjson2 对泛型解析做了优化,对常见泛型嵌套的支持更鲁棒。若项目允许,建议迁移并使用其新版 API:
- 用法类似,但类型推导更稳定:
import com.alibaba.fastjson2.JSON;
Result<userdto> r = JSON.parseObject(json, new TypeReference<result>>() {});</result></userdto>
- 注意 Fastjson2 不兼容旧版注解和部分 SPI 扩展,迁移需测试。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










