Retrofit 2.0 自定义Converter补充篇
2016-07-19 21:21
471 查看
在使用Retrofit请求数据时,一般都用Gson解析Json数据。有时候请求得到的 Json 字符串与返回值类型不对应,比如:
返回值类型
遇到这样的问题,是不是很无奈呢?好在天无绝人之路,我们自定义一个 Converter 来解决这个问题!
当然,别忘了在构造 Retrofit 的时候添加这个 Converter,这样我们就能够愉快的让接口返回 Result 对象了。
注意!!Retrofit 在选择合适的 Converter 时,主要依赖于需要转换的对象类型,在添加 Converter 时,注意 Converter 支持的类型的包含关系以及其顺序。
另一种解决方案:
Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
使用Gson解析json成对象时默认的是将json里对应字段的值解析到java对象里对应字段的属性里面。然后我们经常会遇到我们自己定义的java对象里的属性名跟json里的字段名是不一样的,这种情况怎么办呢,这时我们就可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。
下面说说具体使用方法。
我们有一段json数据如下:
这是一个user的数据包括id、用户名、密码、性别,如果正常些一个user类来解析的话是这样的:
User类要这样写才能直接使用Gson直接解析出来,但是这样的话User类的属性命名就不太友好了,那我们要怎么做呢?Gson提供注解的方法来解决这个问题@SerializedName,使用方法如下:
这样再使用Gson解析的时候就会将n对应的值赋值到userName属性上,同样的如果我们要将User生成json字符串使用Gson生成的时候也会将userName的名字生成n。这样就解决了java对象里属性名跟json里字段名不匹配的情况了。
推荐阅读:
Retrofit 2.0 自定义Converter
{"err":0, "content":"This is a content.", "message":"OK"}
返回值类型
class Result{ int code;//等价于 err String body;//等价于 content String msg;//等价于 message }
遇到这样的问题,是不是很无奈呢?好在天无绝人之路,我们自定义一个 Converter 来解决这个问题!
static class ArbitraryResponseBodyConverterFactory extends Converter.Factory{ @Override public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { return super.responseBodyConverter(type, annotations, retrofit); } } static class ArbitraryResponseBodyConverter implements Converter<ResponseBody, Result>{ @Override public Result convert(ResponseBody value) throws IOException { RawResult rawResult = new Gson().fromJson(value.string(), RawResult.class); Result result = new Result(); result.body = rawResult.content; result.code = rawResult.err; result.msg = rawResult.message; return result; } } static class RawResult{ int err; String content; String message; }
当然,别忘了在构造 Retrofit 的时候添加这个 Converter,这样我们就能够愉快的让接口返回 Result 对象了。
注意!!Retrofit 在选择合适的 Converter 时,主要依赖于需要转换的对象类型,在添加 Converter 时,注意 Converter 支持的类型的包含关系以及其顺序。
另一种解决方案:
Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
使用Gson解析json成对象时默认的是将json里对应字段的值解析到java对象里对应字段的属性里面。然后我们经常会遇到我们自己定义的java对象里的属性名跟json里的字段名是不一样的,这种情况怎么办呢,这时我们就可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。
下面说说具体使用方法。
我们有一段json数据如下:
{ "id":"1" "n":"zhangsan" "p":"123456" "s":"0" }
这是一个user的数据包括id、用户名、密码、性别,如果正常些一个user类来解析的话是这样的:
public class User{ private String id; private String n; private String p; private String s; }
User类要这样写才能直接使用Gson直接解析出来,但是这样的话User类的属性命名就不太友好了,那我们要怎么做呢?Gson提供注解的方法来解决这个问题@SerializedName,使用方法如下:
public class User{ private String id; @SerializedName("n") private String userName; @SerializedName("p") private String password; @SerializedName("s") private String sex; }
这样再使用Gson解析的时候就会将n对应的值赋值到userName属性上,同样的如果我们要将User生成json字符串使用Gson生成的时候也会将userName的名字生成n。这样就解决了java对象里属性名跟json里字段名不匹配的情况了。
推荐阅读:
Retrofit 2.0 自定义Converter
相关文章推荐
- 【CDP-云设计模式】第4章,8.缓存代理模式(Cache Proxy Pattern)
- HDU 1271 整数对
- jqueryuploadify的canceled请求引发SocketException: Software caused connection abort: socket write error
- Leetcode Restore IP Address
- Greenplum安装
- hdu 5179(数位DP||打表)
- Java 监听器
- Hadoop--05--运行WordCount
- poj 1190 生日蛋糕
- 命令模式(Command)
- arm汇编align伪指令详解
- poj1144
- Jquery Md5加密-Jquery.md5.js
- POJ1061 青蛙的约会
- nyoj655 光棍节的yy
- Android性能优化之:绘制优化
- mysql索引
- 基于行块分布函数的网页正文抽取算法代码实现
- 【NOIP2001提高组T3】统计单词个数-字符串上的动态规划
- 问题汇总(软件篇)