Java 如何反序列化泛型类型的对象?

Java 如何反序列化泛型类型的对象?,java,json,generics,gson,json-deserialization,Java,Json,Generics,Gson,Json Deserialization,//用户飞到这里 public class ResponseData<T> { @SerializedName("status") private String mStatus; @SerializedName("description") private String mDescription; @SerializedName("data") private ArrayList<T> mData; @Seriali

//用户飞到这里

public class ResponseData<T>
{
    @SerializedName("status")
    private String mStatus;
    @SerializedName("description")
    private String mDescription;
    @SerializedName("data")
    private ArrayList<T> mData;
    @SerializedName("error_code")
    private int mErrorCode;

    public String getStatus() {return mStatus;}
    public String getDescription() { return mDescription;}
    public ArrayList<T> getData() { return mData; }
}
public class BaseData {}
public class UserData extends BaseData {}
//这里有一些位置字段

public class ResponseData<T>
{
    @SerializedName("status")
    private String mStatus;
    @SerializedName("description")
    private String mDescription;
    @SerializedName("data")
    private ArrayList<T> mData;
    @SerializedName("error_code")
    private int mErrorCode;

    public String getStatus() {return mStatus;}
    public String getDescription() { return mDescription;}
    public ArrayList<T> getData() { return mData; }
}
public class BaseData {}
public class UserData extends BaseData {}
//Json反序列化程序

public class LocationData extends BaseData {}
JsonDeserializer应返回mData为LocationData类型的arraylist的ResponseData或mData为UserData类型的arraylist的ResponseData。

首先

其次,您需要使用类型标记。
TypeToken
是一种伪黑客,可以绕过类型擦除的一些限制

您需要创建一个类型标记

{"data":[{"username":"james","email":"james@gmail.com","height":72.0,"phone":"+15555555555"}], "error_code": 0, "description":null }

{"data":[{"latidue":40.022022,"longitude":-29.23939, "street":"union ave", "borough":"manhattan"}', "error_code": 0, "description":null }
对于每个参数化版本的
ResponseData
,您需要有一个
TypeToken

相关的:


感谢您为我指明了正确的方向。我知道我必须使用TypeToken唯一的问题是我试图弄清楚如何在运行时打开类型标记。我能够通过使用工厂模式来解决这个问题。响应数据可以是位置数据或用户数据。所以我创建了一个令牌工厂,它返回一个新的TypeToken(){};或新的TypeToken(){};并将其传递给JsonDeserializer.fromInputStream