[Android] Gson高级用法:Json串转换成接口字段
2017-07-26 20:24
405 查看
工作后就很少更新博客,这两天在Json解析的时候遇到问题,空了正好记录下。
问题
将后端获取数据转换成客户端创建的模型,然后转换成Json串存入数据库。当在无网络的情况下,则会从数据库从取出数据转换成客户端创建的模型。这些模型中有所有非基本数据类型字段都是用接口表示,在这将对象转成json的时候没有问题,但是反过来将json转成对象的时候却发现失败了,示例代码如下:
这是因为在转换成对象的时候,Gson并不知道该接口对应的实现类是什么,导致转换失败。
解决方案
在查阅资料后得知Gson提供了一个叫“TypeAdapter”的东西,它可以拦截解析的过程,用户可以指定jsonObject所对应的类型。具体Gson实现原理可以参考这篇文章 ,借用文章中的一张图
从图中可以知道,我们在创建gson对象的时候可以利用GsonBuilder注入一个自定义的TypeAdapter对象拦截解析过程从而处理目标对象中一些特殊的字段。
实战
下面我举一个例子具体说明,下图是数据模型UML
Json串的生成
Json串转换成对象[重点]
更多参考链接
How To Serialize And Deserialize Interfaces In Java Using Gson
How to deserialize nested interface types with Gson
GSON SERIALISER EXAMPLE
问题
将后端获取数据转换成客户端创建的模型,然后转换成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
相关文章推荐
- 利用Gson将对象转换成json,忽略某些字段的方法
- Android JSON数据与实体类之间的相互转化-------GSON的用法
- Android JSON数据格式的解析,与简单对象、带泛型的List和Map的转换,以及GSON的使用
- Gson高级用法--->对json字符串进行过滤和检查
- Android 使用GSON解析JSON 并转换为JAVA对象
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- 从零开始学android开发-Json转换利器Gson之实例
- Google-gson, 将JSON 转换为 Java 对象或者将Java对象转换成JSON 的Java库,可以在Android上使用
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- Android的Gson的使用方法,实现Json结构间相互转换
- Android利用Gson实现对象和Json数据的相互转换
- Android的Gson的使用方法,实现Json结构间相互转换
- Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称
- 记录下android json,Gson基本用法
- Android利用Gson实现对象和Json数据的相互转换
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- AndroidStudio插件GsonFormat之Json快速转换JavaBean
- Android 使用Gson解析json用法
- Android开发-进阶:Json字符串转换为java对象的各种实现方法[json_lib框架、Gson、org.json]