gpt4 book ai didi

java - 如何使用 Gson 反序列化嵌套接口(interface)类型

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:13 25 4
gpt4 key购买 nike

我试图让 Gson 将 JSON 中的嵌套对象反序列化为实现接口(interface)的类。

这是我的界面:

public interface ActivationFunction {

public float activate(float input);

}

我有一个名为 LinearActivation 的实现类和一个具有 ActivationFunction 类型的类变量的 Layer 类。这是我的 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);
}

}

任何帮助或指导将不胜感激

最佳答案

按照此处的指南,我能够使其正常工作:

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();

关于java - 如何使用 Gson 反序列化嵌套接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40686101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com