核心在于绕过泛型类型擦除,Class参数提供运行时完整类型信息;单对象反序列化需传Class并直接传递给JSON工具;列表反序列化须用TypeFactory或TypeReference构造带泛型的类型;泛型容器类可嵌入Class字段复用。

核心在于绕过泛型类型擦除,让 JSON 库在运行时真正“看见”目标类型。Class 参数就是那个关键桥梁——它携带了 JVM 在运行期仍保留的完整类型信息。
为什么必须传 Class?
Java 泛型在编译后会被擦除,比如 List
单个对象反序列化的泛型方法
适用于 JSON 字符串表示一个具体对象(非数组):
- 方法签名要声明类型参数,并接收对应的 Class
- 内部直接将该 Class 传给 JSON 工具的 parseObject 或 readValue 方法
- 避免用 (T) obj 强转,那是不安全的伪泛型
示例(FastJSON):
public staticreturn JSON.parseObject(json, clazz);
}
调用:UserInfo user = fromJson("{\"name\":\"Alice\"}", UserInfo.class);
列表对象反序列化的泛型方法
这是最容易出错的场景,因为 List
- 需借助 Jackson 的 TypeFactory 构造带泛型的 JavaType
- 传入的仍是元素类型 Class(如 User.class),但最终构造的是 List
类型 - FastJSON 可用 TypeReference 替代,但 TypeReference 是匿名子类,无法在泛型方法里动态创建
示例(Jackson):
public staticObjectMapper mapper = new ObjectMapper();
JavaType type = TypeFactory.defaultInstance()
.constructCollectionType(List.class, elementType);
return mapper.readValue(json, type);
}
调用:List
泛型容器类中嵌入 Class 字段
当封装逻辑到泛型类内部时(如请求体 ReqBody
- 类字段声明为 private final Class
type - 构造函数接收该 Class 并赋值,后续所有反序列化都复用它
- 避免每次调用方法都重复传参,适合生命周期较长的对象
示例:
public class ReqBodyprivate final Class
private T data;
public ReqBody(String json, Class
this.targetType = targetType;
this.data = JSON.parseObject(json, targetType);
}
}
使用:ReqBody











