如何使用Gson

时间:2016-11-18 21:20:26

标签: java json parsing gson

我试图让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);
    }

}

非常感谢任何帮助或指导

1 个答案:

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