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

Gson和抽象超类:反序列化问题

安坚诚
2023-03-14

假设有一个抽象类,例如A和两个非抽象子类,例如A1A2。我想使用GSON库从json格式“反序列化”它们。

例如。我得到一个A对象的数组。

int n = ...;
A[] list = new A[n];
A[0] = new A1(....);
A[1] = new A2(....);
...

有人将其转换为JSON字符串,如下所示:

String json = (new Gson()).toJson(list);

最后,如果我尝试反序列化如下

A[] deserializedList =  (new Gson()).fromJson(json, A[].class);

然后我有一个错误,因为GSON默认反序列化器找到一个抽象类(即A)并且它无法猜测子类类型。

我如何解决这个问题?

PS:我读过关于自定义反序列化器的文章,但我不明白如何在这种情况下使用它们。

共有1个答案

龚远
2023-03-14

在Axxiss链接之后,下面是答案。必须提供自定义序列化程序/反序列化程序

public class AClassAdapter  implements JsonSerializer<A>, JsonDeserializer<A> {
  @Override
  public JsonElement serialize(A src, Type typeOfSrc, JsonSerializationContext context) {
      JsonObject result = new JsonObject();
      result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));
      result.add("properties", context.serialize(src, src.getClass())); 
      return result;
  }


  @Override
  public A deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
        throws JsonParseException {
    JsonObject jsonObject = json.getAsJsonObject();
    String type = jsonObject.get("type").getAsString();
    JsonElement element = jsonObject.get("properties");

    try {            
        String fullName = typeOfT.getTypeName();
        String packageText = fullName.substring(0, fullName.lastIndexOf(".") + 1);

        return context.deserialize(element, Class.forName(packageText + type));
    } catch (ClassNotFoundException cnfe) {
        throw new JsonParseException("Unknown element type: " + type, cnfe);
    }
  }
}

然后序列化如下所示:

GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(A.class, new ATypeAdapter());
String json = gson.create().toJson(list);

给定json字符串,反序列化为:

GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(A.class, new ATypeAdapter());

return gson.create().fromJson(json, A[].class);
 类似资料:
  • 问题内容: 假设有一个 抽象 类say 和两个非抽象子类say 和。我想通过使用GSON库从json格式“反序列化”它们。 例如,我得到一个对象数组。 有人将其转换为JSON字符串,如下所示: 最后,如果我尝试如下反序列化 那么我就遇到了一个错误,因为GSON默认的反序列化器找到了一个抽象类(即),并且它无法猜测子类的类型。 我该如何解决? PS:我阅读了有关自定义反序列化器的信息,但在这种情况下

  • 问题内容: 我正在尝试使用Gson反序列化JSON格式的树对象。每个节点都包含其子节点作为对象类型Node的字段。Node是一个接口,具有多个具体的类实现。在反序列化过程中,如果我不知道节点属于哪种类型,那么在反序列化节点时如何与Gson沟通要实现哪个具体类?每个节点都有一个指定类型的成员字段。当对象为序列化形式时,是否有一种方法可以访问该字段,并以某种方式将该类型传达给Gson? 谢谢! 问题答

  • 我一辈子都想不出如何反序列化这一点: 到,其中PetPlayer包含一个名为“pets”的多映射,结构如下;。这里,PetType是枚举,Pet是一个抽象类,具有多个实现。 我尝试使用这两个序列化器和反序列化器。 我非常感谢任何帮助:)

  • 我正在尝试使用JSON ObjectMapper反序列化对象。我在尝试反序列化时看到以下错误

  • 也许我跑错了方向,但我有一个元素列表,我想读。 我有一个抽象基类,让我们称之为: 现在我有两个可能的实现:

  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?