TypeReference解决Fastjson反序列化时泛型擦除问题-笔记

com.alibaba.fastjson.TypeReference 是 Fastjson 库中的一个泛型类型引用类,主要用于解决 Java 泛型在运行时类型擦除的问题。它使得在反序列化 JSON 数据时能够保留完整的泛型类型信息(如 ListMap 等),确保数据被正确解析为预期的复杂类型。

TypeReference是一个抽象类,我们通常通过创建一个匿名内部类来使用它(例如 new TypeReference(){})。在创建匿名内部类时,我们会指定具体的泛型类型(例如T 为 List),这样在运行时就可以通过反射获取到这些类型信息。


1. 核心功能与原理

  1. 绕过类型擦除
    Java 泛型在编译后会进行类型擦除(例如 List 会变成原始类型 List)。TypeReference 通过捕获匿名子类的泛型参数类型信息,使 Fastjson 能获取到完整的泛型定义。

  2. 简化复杂泛型解析
    直接传递 new TypeReference(){ } 作为参数,Fastjson 即可自动推断目标类型,无需手动创建复杂的 JavaType 对象。


2. 使用示例

2.1. 解析泛型集合(如 List
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        String json = "[\"A\", \"B\", \"C\"]";
        
        // 使用 TypeReference 指定目标类型为 List
        List list = JSON.parseObject(json, new TypeReference>() {});
        
        System.out.println(list); // 输出: [A, B, C]
        System.out.println(list.get(0).getClass()); // 输出: class java.lang.String
    }
}
2.2. 解析嵌套泛型(如 Map>
String json = "{\"scores\": [90, 80, 100], \"ranks\": [1, 2, 3]}";

// 指定目标类型为 Map>
Map> map = JSON.parseObject(
    json,
    new TypeReference>>() {}
);

System.out.println(map.get("scores").get(0)); // 输出: 90 (类型为Integer)
2.3. 解析自定义泛型对象
class Result {
    T data;
    // 省略 getter/setter
}

String json = "{\"data\": {\"name\": \"Fastjson\", \"version\": 1}}";

// 指定目标类型为 Result>
Result> result = JSON.parseObject(
    json,
    new TypeReference>>() {}
);

Map data = result.getData();
System.out.println(data.get("name")); // 输出: Fastjson

3.关键点说明

  1. 语法要求
    必须通过匿名子类方式使用:new TypeReference<目标类型>() {}注意结尾的 {}

  2. 与 Class 参数的区别

    • ❌ 错误做法:JSON.parseObject(json, List.class)
      解析后得到的是 List,元素类型丢失。
    • ✅ 正确做法:JSON.parseObject(json, new TypeReference>() {})
      元素类型 String 被保留。

    • 4.应用场景

      • 解析多层嵌套的泛型结构(如 List>)。
      • 处理 API 返回的通用响应体(如 Result)。
      • 任何需要保留完整泛型信息的反序列化场景。

      通过 TypeReference,Fastjson 能够精确还原复杂的泛型数据结构,避免手动类型转换,大幅提升代码安全性与可读性。

      你可能感兴趣的:(笔记,java)