假设有一个抽象类,例如A
和两个非抽象子类,例如A1
和A2
。我想使用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:我读过关于自定义反序列化器的文章,但我不明白如何在这种情况下使用它们。
在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.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?