gpt4 book ai didi

java - 使用 Gson 反序列化 ImmutableList

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:56 25 4
gpt4 key购买 nike

我正在使用相当多的不可变集合,我很好奇如何使用 Gson 反序列化它们。由于没有人回答并且我自己找到了解决方案,我正在简化问题并提出我自己的答案。

我有两个问题:

  • 如何写单Deserializer为所有人工作ImmutableList<XXX>
  • 如何为所有人注册 ImmutableList<XXX>

最佳答案

更新:有 https://github.com/acebaggins/gson-serializers其中涵盖了许多 Guava 系列:

  • ImmutableList
  • ImmutableSet
  • ImmutableSortedSet
  • ImmutableMap
  • ImmutableSortedMap

How to write a single Deserializer working for all ImmutableList?

思路很简单,将传递过来的Type进行改造代表一个 ImmutableList<T>进入Type代表List<T> , 使用内置 Gson创建 List 的能力并将其转换为 ImmutableList .

class MyJsonDeserializer implements JsonDeserializer<ImmutableList<?>> {
@Override
public ImmutableList<?> deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
final Type type2 = ParameterizedTypeImpl.make(List.class, ((ParameterizedType) type).getActualTypeArguments(), null);
final List<?> list = context.deserialize(json, type2);
return ImmutableList.copyOf(list);
}
}

有多个ParameterizedTypeImpl我使用的 Java 库中的类,但它们都不打算供公众使用。我用 sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl 测试了它.

How to register it for all ImmutableList?

那部分很简单,注册的第一个参数是java.lang.reflect.Type这误导我使用 ParameterizedType , 只需使用 Class做的工作:

final Gson gson = new GsonBuilder()
.registerTypeAdapter(ImmutableList.class, myJsonDeserializer)
.create();

关于java - 使用 Gson 反序列化 ImmutableList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706772/

25 4 0