您的位置:首页 > 移动开发 > Android开发

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

2017-07-26 20:24 405 查看
工作后就很少更新博客,这两天在Json解析的时候遇到问题,空了正好记录下。

问题

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

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


这是因为在转换成对象的时候,Gson并不知道该接口对应的实现类是什么,导致转换失败。

解决方案

在查阅资料后得知Gson提供了一个叫“TypeAdapter”的东西,它可以拦截解析的过程,用户可以指定jsonObject所对应的类型。具体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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐