我试图让Gson将我的JSON中的嵌套对象反序列化为实现接口的类。
这是我的界面:
public interface ActivationFunction {
public float activate(float input);
}
我有一个名为LinearActivation的实现类和一个Layer类,它具有ActivationFunction类型的类变量。这是我的JSON:
{
"layers" : [
{
"input":6,
"output":2,
"weights":[[1,2,3,4,5,6],[7,8,9,10,11,12]],
"function":{"LinearFunction"
}
]
}
我看过这篇文章:Polymorphism with gson我在这里搜索了Gson文档:https://github.com/google/gson/blob/master/UserGuide.md#TOC-Writing-a-Deserializer
但我找不到有关创建typeHierarchyAdapter的任何文档。我在第一个链接中跟随了示例,但我不确定如何在我的JSON结构中使用INSTANCE和CLASSNAME。
以下是类型层次结构适配器:
public class ActivationFunctionAdapter implements JsonDeserializer<ActivationFunction> {
private static final String CLASSNAME = "CLASSNAME";
private static final String INSTANCE = "INSTANCE";
@Override
public ActivationFunction deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
JsonPrimitive prim = (JsonPrimitive) jsonObject.get(CLASSNAME);
String className = prim.getAsString();
Class<?> klass = null;
try {
klass = Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new JsonParseException(e.getMessage());
}
return context.deserialize(jsonObject.get(INSTANCE), klass);
}
}
非常感谢任何帮助或指导
答案 0 :(得分:0)
我可以按照此处的指南进行操作:
https://futurestud.io/tutorials/how-to-deserialize-a-list-of-polymorphic-objects-with-gson
在这个问题的Perception答案中也可以看到相同的信息:Using Gson with Interface Types
基本上只需要将RuntimeTypeAdapterFactory类添加到我的项目中(代码在Gson github的extras包中可用),然后定义类型标记并使用它。例如:
TypeToken<ActivationFunction> functionTypeToken = new TypeToken<ActivationFunction>() {};
RuntimeTypeAdapterFactory<ActivationFunction> typeFactory =
RuntimeTypeAdapterFactory.of(ActivationFunction.class, "type")
.registerSubtype(LinearFunction.class, "linear");
final Gson gson = new GsonBuilder().registerTypeAdapterFactory(typeFactory).create();