当前位置: 首页 > 知识库问答 >
问题:

用GSON序列化带有通用嵌套数据对象的响应对象

冯新知
2023-03-14

我正在使用带有GSON的改进型来实现JSON序列化,并使用Realm来实现存储。

{
   status : 1
   data: { object data }
}
public class ResponseDeserializer implements JsonDeserializer {

@Override
public Object1 deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
{
    JsonElement data = je.getAsJsonObject().get("data");
    GsonBuilder gsonBuilder = new GsonBuilder()
            .setExclusionStrategies(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    return f.getDeclaringClass().equals(RealmObject.class);
                }

                @Override
                public boolean shouldSkipClass(Class<?> clazz) {
                    return false;
                }
            });
    Gson gson = gsonBuilder.create();
    Object1 o1 = gson.fromJson(data, new TypeToken<Object1>() {}.getType());
    return o1;
}
}

第一个问题:当我尝试将fromJson更改为泛型类型时,会产生一个带有对象键值对的“com.google.gson.internal.LinkedTreeMap”,代码:

public class ResponseDeserializer<T> implements JsonDeserializer<T> {

@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
{
    JsonElement data = je.getAsJsonObject().get("data");
    GsonBuilder gsonBuilder = new GsonBuilder()
            .setExclusionStrategies(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    return f.getDeclaringClass().equals(RealmObject.class);
                }

                @Override
                public boolean shouldSkipClass(Class<?> clazz) {
                    return false;
                }
            });
    Gson gson = gsonBuilder.create();
    T o = gson.fromJson(data, new TypeToken<T>() {}.getType());
    return o;
}
}

第二个问题:反序列化器如何根据json结果返回对象或对象列表。

共有1个答案

邴越彬
2023-03-14

现在我用一种不同的方法解决了它:

2列表和对象响应模型:

public class ApiResponse<T> {
    private int success;
    private String[] errors;
    private String[] messages;
    private T data;
}

public class ApiListResponse<T> {
    private int success;
    private String[] errors;
    private String[] messages;
    private List<T> data;
}

1响应模型的反序列化器

public class ResponseDeserializer<T> implements JsonDeserializer {
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException {
    JsonElement data = je.getAsJsonObject().get("data");
    GsonBuilder gsonBuilder = new GsonBuilder()
            .setExclusionStrategies(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    return f.getDeclaringClass().equals(RealmObject.class);
                }

                @Override
                public boolean shouldSkipClass(Class<?> clazz) {
                    return false;
                }
            });
    Gson gson = gsonBuilder.create();
    T response = gson.fromJson(je, type);
    return response;
}
}

现在我可以为GSON注册类型,比如:

gsonBuilder.registerTypeAdapter(new TypeToken<ApiResponse<Object1>>() {}.getType(), new ResponseDeserializer<ApiResponse>());
gsonBuilder.registerTypeAdapter(new TypeToken<ApiListResponse<Object1>>() {}.getType(), new ResponseDeserializer<ApiListResponse>());

现在将正确转换以下JSON响应:

API响应

{  
   "data":{  
      "Object1Id":"1",
      "Name":"Test 1",
   },
   "messages":[  
   ],
   "errors":[  
   ],
   "success":"1"
}

ApilistResponse

{  
   "data":[{  
      "Object1Id":"1",
      "Name":"Test 1",
   },{  
      "Object1Id":"2",
      "Name":"Test 2",
   }],
   "messages":[  
   ],
   "errors":[  
   ],
   "success":"1"
}

有更好的解决方案吗?

 类似资料:
  • 问题内容: 我有一个名为的类,该类具有一个作为参数的构造函数: 具有以下属性: 并且是我的应用程序的其他类,并具有以下构造函数: ,并且是的子类。 我想用Gson 反序列化数组,所以我写道: 以定义为: 调试时,实例具有正确的“ MainActivity”作为上下文,而其成员变量的上下文为null。 Gson 使用正确的构造函数创建了对象,但使用默认的无参数构造函数创建了实例。我怎样才能解决这个问

  • 我有一个名为PageItem的类,它有一个构造函数,该构造函数将上下文作为参数: 具有以下属性: 新闻提供者(Newsprovider)和主题(Topic)是我的应用程序的其他类,具有以下构造函数:

  • 我想将这个对象序列化为JSON字符串 并得到如下结果: 我试着用 但不是这样,我得到了: 个性化序列化: 欢迎提出任何建议 谢谢,马里奥

  • 我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"

  • 问题内容: 我正在尝试使用Gson反序列化从Web服务返回的json字符串 该结构将以返回。 哪里像 和ItemDTO就像 当我按如下方式调用代码时 对象内部的所有内容均为空 但是,如果我使用 并将它们从org.json罐子中逐段拉出,效果很好,并相应地填充了字段。 关于我在做什么错的任何想法吗?Gson非常快吗?还是我最好坚持自己已经做的工作​​? 谢谢大卫 问题答案: 原始问题中的示例Java

  • 主要内容:示例我们将一个Java对象序列化为一个Json文件,然后读取该Json文件以获取对象。 在这个例子中,创建一个类。 然后将对象列化后存储在文件中,该文件将具有对象的json表示形式。 示例 在中创建一个名为的Java类文件,参考以下代码 - 执行上面示例代码,得到以下结果 -