加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用Gson反序列化ImmutableList

发布时间:2020-12-14 05:04:02 所属栏目:Java 来源:网络整理
导读:我使用了很多不可变的集合,我很好奇如何使用Gson反序列化它们.没有人回答,我自己找到了解决方案,我简化了问题并提出了自己的答案. 我有两个问题: 如何编写适用于所有ImmutableList XXX的单个解串器 如何注册所有ImmutableList XXX? 解决方法 How to write
我使用了很多不可变的集合,我很好奇如何使用Gson反序列化它们.没有人回答,我自己找到了解决方案,我简化了问题并提出了自己的答案.

我有两个问题:

>如何编写适用于所有ImmutableList< XXX>的单个解串器
>如何注册所有ImmutableList< XXX>?

解决方法

How to write a single Deserializer working for all ImmutableList?

这个想法很简单,转换代表一个ImmutableList< T>转换为表示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);
    }
}

我使用的Java库中有多个ParameterizedTypeImpl类,但它们都不用于公共使用.我用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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读