java - 使用 GSON 反序列化通用数据类型

标签 java gson

我第一次在这里发帖。

来 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/

相关文章:

android - GSON:仅在已发布的应用程序中使用我的 JSONEntity 无法正确创建,使用 Android Studio 可以正常工作

java - 使用 Gson 反序列化对象和列表

用于询问 XSD 文件的 Java 方法

java - 最好将 protected 更改为公共(public)?或创建另一个调用父类(super class)的方法

java - 当用户在拍照时按下后退按钮时程序崩溃

java - 如果我必须将以下 JSON 转换为 Java 对象,我的 DTO 类应该是什么样子?

java - 在 Java 中的运行时确定泛型类型参数

java - Gson - 任意对象

java - 有没有办法告诉 android 强制停止哪个 Activity 进入后台而不将其从 Activity 堆栈中删除?

java - 错误: cannot resolve symbol 'edit_message' in MyFirstApp tutorial