我希望有一个自定义的GSON反序列化程序,这样每当它对JSON对象(即花括号内的任何内容
然而,我希望在
{ ... }
)进行反序列化时,它都会查找一个 $type
节点并使用其内置的反序列化能力来反序列化为该类型。如果没有找到 $type
对象,则它将按照正常方式执行。例如,我希望以下代码可以正常工作:{
"$type": "my.package.CustomMessage"
"payload" : {
"$type": "my.package.PayloadMessage",
"key": "value"
}
}
public class CustomMessage {
public Object payload;
}
public class PayloadMessage implements Payload {
public String key;
}
调用:Object customMessage = gson.fromJson(jsonString, Object.class)
。
如果我将payload
类型更改为Payload
接口,目前情况如此:
public class CustomMessage {
public Payload payload;
}
接下来的TypeAdapterFactory
将会按照我希望的方式执行:
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
final PojoTypeAdapter thisAdapter = this;
public T read(JsonReader reader) throws IOException {
JsonElement jsonElement = (JsonElement)elementAdapter.read(reader);
if (!jsonElement.isJsonObject()) {
return delegate.fromJsonTree(jsonElement);
}
JsonObject jsonObject = jsonElement.getAsJsonObject();
JsonElement typeElement = jsonObject.get("$type");
if (typeElement == null) {
return delegate.fromJsonTree(jsonElement);
}
try {
return (T) gson.getDelegateAdapter(
thisAdapter,
TypeToken.get(Class.forName(typeElement.getAsString()))).fromJsonTree(jsonElement);
} catch (ClassNotFoundException ex) {
throw new IOException(ex.getMessage());
}
}
然而,我希望在
payload
的类型为 Object
或其他任何类型时都能够工作,并且如果无法分配变量,则抛出某种类型匹配异常。