Java 使用GSON反序列化泛型数据类型

Java 使用GSON反序列化泛型数据类型,java,gson,Java,Gson,我第一次在这里发帖 来自我的服务器的json响应如下所示 { "success": true, "message": null, "data": { "id": 1, "name": "1" } } import com.google.gson.annotations.Expose; public class ResponseTemplate<T>{ @Expose private boolean success; @

我第一次在这里发帖

来自我的服务器的json响应如下所示

{
  "success": true,
  "message": null,
  "data": {
     "id": 1,
     "name": "1"
  }
}
import com.google.gson.annotations.Expose;

public class ResponseTemplate<T>{

    @Expose
    private boolean success;
    @Expose
    private String message;
    @Expose
    private T data;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public T getData() {
        return this.data;
    }

}
data
字段可以是一个
列表
,也可以是
MyModelClass
,在上面的示例中,它只是一个对象

json输出上的字段名与我的所有POJO类完全匹配

我的响应模板如下所示

{
  "success": true,
  "message": null,
  "data": {
     "id": 1,
     "name": "1"
  }
}
import com.google.gson.annotations.Expose;

public class ResponseTemplate<T>{

    @Expose
    private boolean success;
    @Expose
    private String message;
    @Expose
    private T data;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public T getData() {
        return this.data;
    }

}
那么它会给我一个错误

Exception in thread "main" java.lang.IllegalArgumentException: Can not set int field models.MyModelClass.id to com.google.gson.internal.LinkedTreeMap
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:379)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:86)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
at com.google.gson.Gson.toJson(Gson.java:593)
at com.google.gson.Gson.toJson(Gson.java:572)
at com.google.gson.Gson.toJson(Gson.java:527)
在这一行
gson.toJson(response.getData(),MyModelClass.class)
它将中断

奇怪的是,如果
getData()
的输出是
List
,但如果
getData()
的输出只是
MyModelClass
,即使所有字段名都正确映射,它也无法映射


有没有更好的方法来实现这一点?也许是一个普通的反序列化程序?我没有尝试搜索,但找不到我真正需要的东西。

我这样做解决了我的问题:

//if its a list
//Type dataType = new TypeToken<ResponseTemplate<List<MyModelClass>>>() {}.getType();

//if its a single object
Type dataType = new TypeToken<ResponseTemplate<MyModelClass>>() {}.getType();
ResponseTemplate response = new Gson().fromJson(gson.toJson(apiService.getMyObject(), dataType), dataType);

MyModelClass myModelClass = response.getData();
//如果是列表
//类型dataType=newTypeToken(){}.getType();
//如果它是一个单一的对象
类型dataType=newTypeToken(){}.getType();
ResponseTemplate response=new Gson().fromJson(Gson.toJson(apiService.getMyObject(),dataType),dataType);
MyModelClass MyModelClass=response.getData();