如何在JsonSerializer中使用Type参数?

时间:2015-02-24 21:37:14

标签: java json gson

网上有很多关于如何使用Gson在Java中进行自定义序列化/反序列化的例子(例如,Java Creed有一个很好的教程)。我没有找到,我不明白的是,我应该如何使用JsonSerializer#serialize(T, Type, JsonSerializationContext)方法的第二个Type参数。

它只是用于我的实现中的类型检查吗?有人可以提供一个说明性的例子吗?

1 个答案:

答案 0 :(得分:1)

它可以用于使用相等而不是instanceof来测试对象的类,因为Class实现了Type接口。

这是一个使用registerTypeHierarchyAdapter()和一个序列化程序的工作示例,该序列化程序的行为取决于类型参数。

public static class Animal { }
public static class Horse extends Animal {}
public static class Sheep extends Animal {}

private static class MySerializer implements JsonSerializer<Animal> {

    @Override
    public JsonElement serialize(Animal src, Type typeOfSrc,
            JsonSerializationContext context) {
        JsonPrimitive element = null;
        if (typeOfSrc == Sheep.class) {
            element = new JsonPrimitive("sheep");
        } else if (typeOfSrc == Horse.class) {
            element = new JsonPrimitive("horse");
        }
        return element; 
    }

}

public static void main(String[] args) {
    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeHierarchyAdapter(Animal.class, new MySerializer());
    System.out.println(builder.create().toJson(
            Arrays.asList(new Horse(), new Sheep())));
}

这应该相当于

    @Override
    public JsonElement serialize(Animal src, Type typeOfSrc,
            JsonSerializationContext context) {
        JsonPrimitive element = null;
        if (src instanceof Sheep) {
            element = new JsonPrimitive("sheep");
        } else if (src instanceof Horse) {
            element = new JsonPrimitive("horse");
        }
        return element; 
    }

使用src和typeOfSrc之间的区别似乎很微妙,我还在研究。 java.lang.Type是所有类型的超级接口。因此,可能存在一些极端情况,您可以使用“类型”来执行某些操作。

java.lang.reflect.Type
  => java.lang.Class
  => GenericArrayType
  => ParameterizedType
  => TypeVariable
  => etc.