【发布时间】:2014-05-16 13:01:24
【问题描述】:
我希望有一个自定义的 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;
}
那么下面的TypeAdapaterFactory会做我想做的事:
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 或任何类型时工作,如果它无法分配变量,则抛出某种类型匹配异常。
【问题讨论】:
-
您能否详细说明您的解决方案无法解决的问题?
-
@DamianWalczak - 结果表明它需要反序列化为
CustomMessageok,但它实际上并没有命中有效负载的 typeadapterfactory...它只是使用其内置的反序列化
标签: java json serialization gson