gpt4 book ai didi

java - 如何在 JsonSerializer 中使用 Type 参数?

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

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

它只是为了在我的实现中进行类型检查吗?有人可以提供一个说明性的例子吗?

最佳答案

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

这是一个使用 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 是所有类型的 super 接口(interface)。因此,在某些特殊情况下,您可以使用 Type 完成一些没有 Class 就无法完成的操作。

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

关于java - 如何在 JsonSerializer 中使用 Type 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28706812/

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