在 Gson 中反序列化抽象类
2022-09-01 01:23:44
我有一个JSON格式的树对象,我试图用Gson反序列化。每个节点都包含其子节点作为对象类型 Node 的字段。Node是一个接口,它有几个具体的类实现。在反序列化过程中,如果我不知道节点属于哪种类型,那么在反序列化节点时如何向Gson传达要实现的具体类?每个节点都有一个指定类型的成员字段。有没有办法在对象采用序列化形式时访问该字段,并以某种方式将类型传达给Gson?
谢谢!
我有一个JSON格式的树对象,我试图用Gson反序列化。每个节点都包含其子节点作为对象类型 Node 的字段。Node是一个接口,它有几个具体的类实现。在反序列化过程中,如果我不知道节点属于哪种类型,那么在反序列化节点时如何向Gson传达要实现的具体类?每个节点都有一个指定类型的成员字段。有没有办法在对象采用序列化形式时访问该字段,并以某种方式将类型传达给Gson?
谢谢!
我建议为s添加一个自定义JsonDeserializer:Node
Gson gson = new GsonBuilder()
.registerTypeAdapter(Node.class, new NodeDeserializer())
.create();
您将能够访问反序列化程序方法中的表示节点,将其转换为 a ,并检索指定该类型的字段。然后,您可以基于该实例创建正确类型的 实例。JsonElement
JsonObject
Node
您需要同时注册 JSONSerializer 和 JSONDeserializer。此外,还可以通过以下方式为所有接口实现通用适配器:
这是我为自己使用的实现,工作正常。
public class PropertyBasedInterfaceMarshal implements
JsonSerializer<Object>, JsonDeserializer<Object> {
private static final String CLASS_META_KEY = "CLASS_META_KEY";
@Override
public Object deserialize(JsonElement jsonElement, Type type,
JsonDeserializationContext jsonDeserializationContext)
throws JsonParseException {
JsonObject jsonObj = jsonElement.getAsJsonObject();
String className = jsonObj.get(CLASS_META_KEY).getAsString();
try {
Class<?> clz = Class.forName(className);
return jsonDeserializationContext.deserialize(jsonElement, clz);
} catch (ClassNotFoundException e) {
throw new JsonParseException(e);
}
}
@Override
public JsonElement serialize(Object object, Type type,
JsonSerializationContext jsonSerializationContext) {
JsonElement jsonEle = jsonSerializationContext.serialize(object, object.getClass());
jsonEle.getAsJsonObject().addProperty(CLASS_META_KEY,
object.getClass().getCanonicalName());
return jsonEle;
}
}
然后,您可以为所有接口注册此适配器,如下所示
Gson gson = new GsonBuilder()
.registerTypeAdapter(IInterfaceOne.class,
new PropertyBasedInterfaceMarshal())
.registerTypeAdapter(IInterfaceTwo.class,
new PropertyBasedInterfaceMarshal()).create();