我第一次在这里发帖。
来 self 的服务器的 json 响应如下所示
{
"success": true,
"message": null,
"data": {
"id": 1,
"name": "1"
}
}
data
字段可能是 List<MyModelClass>
或者它可能只是 MyModelClass
在上面的示例中,它只是一个对象。
json 输出中的字段名称与我的所有 POJO 类完全匹配。
我的回复模板如下所示
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;
}
}
然后将数据从 getData()
转换我必须这样做
//.... this is inside a function
ResponseTemplate response = apiService.getMyObject();
if (response.isSuccess()) {
// if its a list
//Type dataType = new TypeToken<List<MyModelClass>>() {
//}.getType();
//if a single object
String toJson = gson.toJson(response.getData(), MyModelClass.class);
System.out.println(toJson);
new Gson().fromJson(gson.toJson(response.getData(), MyModelClass.class), MyModelClass.class);
} else {
return null;
}
然后它会给我一个错误
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<MyModelClass>
但如果 getData()
的输出只有MyModelClass
即使所有字段名称都正确映射,Gson 也无法映射它。
有没有更好的方法来实现这个?也许是一个常见的解串器?我一直在尝试搜索,但无法真正找到我需要的东西。
最佳答案
我通过这样做解决了我的问题:
//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();
关于java - 使用 GSON 反序列化通用数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25755997/