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

时间:2013-06-01 12:02:38

标签: java gson

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

E.g。我得到了一组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 个答案:

答案 0 :(得分:18)

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 thepackage = "my.package.name.";         
        return context.deserialize(element, Class.forName(thepackage + 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);