关闭

[Android] Gson高级用法:Json串转换成接口字段

标签: gson解析
1973人阅读 评论(0) 收藏 举报
分类:

工作后就很少更新博客,这两天在Json解析的时候遇到问题,空了正好记录下。

问题
将后端获取数据转换成客户端创建的模型,然后转换成Json串存入数据库。当在无网络的情况下,则会从数据库从取出数据转换成客户端创建的模型。这些模型中有所有非基本数据类型字段都是用接口表示,在这将对象转成json的时候没有问题,但是反过来将json转成对象的时候却发现失败了,示例代码如下:

        Gson gson = new Gson();
        gson.fromJson(jsonData, Model.class);

这是因为在转换成对象的时候,Gson并不知道该接口对应的实现类是什么,导致转换失败。
解决方案
在查阅资料后得知Gson提供了一个叫“TypeAdapter”的东西,它可以拦截解析的过程,用户可以指定jsonObject所对应的类型。具体Gson实现原理可以参考这篇文章 ,借用文章中的一张图
Gson解析原理

从图中可以知道,我们在创建gson对象的时候可以利用GsonBuilder注入一个自定义的TypeAdapter对象拦截解析过程从而处理目标对象中一些特殊的字段。
实战
下面我举一个例子具体说明,下图是数据模型UML
这里写图片描述

  • Json串的生成
        Course course = new Course();
        course.addUnit(new Video());
        String jsonData = new GsonBuilder().create().toJson(course);
  • Json串转换成对象[重点]
        Gson newGson = new GsonBuilder().registerTypeAdapter(Unit.class, new JsonDeserializer<Unit>() {
            @Override
            public Unit deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
                return jsonDeserializationContext.deserialize(jsonElement, Video.class);
            }
        }).registerTypeAdapter(Info.class, new JsonDeserializer<Info>() {
            @Override
            public Info deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
                return jsonDeserializationContext.deserialize(jsonElement, InfoImpl.class);
            }
        })
                .create();
       Course course = newGson.fromJson(jsonData, Course.class);

更多参考链接
How To Serialize And Deserialize Interfaces In Java Using Gson
How to deserialize nested interface types with Gson
GSON SERIALISER EXAMPLE

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:148796次
    • 积分:2729
    • 等级:
    • 排名:第14634名
    • 原创:119篇
    • 转载:10篇
    • 译文:0篇
    • 评论:73条
    最新开源项目(师大+)
    最新评论