Retrofit系列文章翻译8—自定义一个响应转换器

原文链接:https://futurestud.io/blog/retrofit-send-objects-in-request-body
本篇介绍了在 Retrofit 里如何设置自定义 JSON 转换器。下面的列表显示了该系列的所有文章:

在 Retrofit 2里实现自定义响应转换器是一个复杂的过程. 我们一定会写一篇关于如何在 Retrofit 2中创建和集成自己的响应转换器的另一篇博客. 一旦发布,我们将在此处链接和更新本说明。(原文评论里提到 Retrofit 2的自定义转换器教程不会公开发布了, 有读者自己做了实现, 可以参考, 译者注)

Retrofit 系列目录

  1. 开始创建android客户端[已翻译]
  2. Android上的基本认证[已翻译]
  3. Android上的令牌认证[已翻译]
  4. Android上的OAuth
  5. 多个 Query 参数使用同一名字[已翻译]
  6. 同步与异步请求[已翻译]
  7. 在请求体里发送对象[已翻译]
  8. 自定义一个响应转换器
  9. 添加自定义请求头
  10. 可选的 Query 参数
  11. 如何集成 XML 转换器
  12. 使用 Log Level 调试请求
  13. 如何上传文件
  14. Series Round-Up
  15. Retrofit 2 — 1.9 升级指南
  16. Retrofit 2 — 如何上传文件
  17. Retrofit 2 — Log 请求与响应
  18. Retrofit 2 — Android 上的 Hawk 认证
  19. Retrofit 2 — 简单错误处理
  20. 如何在 Retrofit 1 里使用 OkHttp 3
  21. Retrofit 2 — 图书更新发布庆典
  22. 提交表单数据 — Urlencoded
  23. 提交表单数据 — Urlencoded 使用FieldMap
  24. Retrofit 2 — 在 OkHttp 拦截器里管理请求头部
  25. Retrofit 2 — 如何给每一个请求添加 Query 参数
  26. Retrofit 2 — 使用QueryMap 添加多个 Query 参数
  27. Retrofit 2 — 如何在请求时使用动态 Url
  28. Retrofit 2 — Url 处理,分辨和解析
  29. Retrofit 2 — POST 和PUT 请求里的常量, 默认值和逻辑值
  30. Retrofit 2 — 如何下载文件
  31. Retrofit 2 — 取消请求
  32. Retrofit 2 — 重用分析请求
  33. Retrofit 2 — 如何在运行时修改 API Base Url
  34. 可选Path参数
  35. 如何刷新 Access Token
  36. Retrofit 2 — 如何提交文本请求体
  37. Retrofit 2 — 使用 Query 参数来分页
  38. Retrofit 2 — 使用 链接头和动态 Url 来分页(比如GitHub)
  39. Retrofit 2 — 使用范围头字段来分页 (比如 Heroku)
  40. Retrofit 2 — 转换器介绍
  41. Retrofit 2 — 添加并自定义 Gson 转换器
  42. Retrofit 2 — 实现自定义转换器
  43. Retrofit 2 — 只在开发环境里启用日志
  44. Retrofit 2 — 如何上传多个文件
  45. Retrofit 2 — Passing Multiple Parts Along a File with @PartMap
  46. Retrofit 2 — 模仿服务端响应基本概念
  47. Retrofit 2 — 模仿服务端响应自定义网络行为
  48. Retrofit 2 — 使用 @HeaderMap 定义动态请求头

基础

Retrofit 默认附带了 Google's JSON. 每个JSON映射都在GSON的帮助下完成. 有时候,你的框架或属性需要改变集成的JSON转换器. 一个著名的转换器是 Jackson. 我们将使用 Jackson 做为代码示例.

现有的 Retrofit 转换器

除了 GSON, Retrofit 可被配置成各种内容格式. retrofit-converters 目录列出了现有的响应转换器:

与gradle的整合可以用以下命令来完成:

compile 'com.squareup.retrofit:converter-<converter-name>:1.9.0'

# e.g. Jackson
compile 'com.squareup.retrofit:converter-jackson:1.9.0'

# e.g. XML
compile 'com.squareup.retrofit:converter-simplexml:1.9.0' 

你应该知道如何整合 protocol buffers :)

创建你自己的转换器

一旦你需要或想要创建自己的 Retrofit 响应转换器,你可以按照下面的步骤. 我们将使用 Jackson 库来说明具体的定义和处理.
记住: 目前已有的 Retrofit 转换器 你可以通过集成各自的gradle依赖直接使用它们.

Jackson Gradle 依赖

首先, 定义 Jackson 依赖. 本例使用的是 Jackson 2.x ,与以前的 Jackson 1.x 有很大的不同. 添加需要的 Maven 库和编译依赖.

repositories {  
    maven { url "http://repository.codehaus.org/org/codehaus" }
}

dependencies {  
    compile 'com.fasterxml.jackson.core:jackson-databind:2.4.3'
}

实现自定义的 JSON 转换器

替换 Retrofit 的 JSON 转换器最重要的部分是实现 Converter 接口并覆盖两个方法: fromBody and toBody.

public class JacksonConverter implements Converter {
    private ObjectMapper mapper = new ObjectMapper();

    @Override
    public Object fromBody(TypedInput body, Type type) throws ConversionException {
        JavaType javaType = mapper.getTypeFactory().constructType(type);

        try {
            return mapper.readValue(body.in(), javaType);
        } catch (IOException e) {
            throw new ConversionException(e);
        }
    }

    @Override
    public TypedOutput toBody(Object object) {
        try {
            String charset = "UTF-8";
            String json = mapper.writeValueAsString(object);
            return new JsonTypedOutput(json.getBytes(charset));
        } catch (IOException e) {
            throw new AssertionError(e);
        }
    }

    private static class JsonTypedOutput implements TypedOutput {
        private final byte[] jsonBytes;

        JsonTypedOutput(byte[] jsonBytes) { this.jsonBytes = jsonBytes; }

        @Override public String fileName() { return null; }
        @Override public String mimeType() { return "application/json; charset=UTF-8"; }
        @Override public long length() { return jsonBytes.length; }
        @Override public void writeTo(OutputStream out) throws IOException { out.write(jsonBytes); }
    }
}

JsonTypedOutput 类被用来设置正确的 mimeType. 由于输出类型是JSON, mime 类型也应该是 application/json.

设置自定义JSON转换器

Retrofit 的 JSON转换器被集成在RestAdapter里. 通过调用RestAdapter对象的setConverter()方法可以改变转换器. 此外, 当创建 rest 客户端时, 你可以在RestAdapter的构建过程里直接设置转换器来集成 jackson 转换器.

    // Create our Converter
    JacksonConverter jacksonConverter = new JacksonConverter();

    // Build the Retrofit REST adaptor pointing to the URL specified, with the Converter.
    // Note: The Converter must be set before the .build() command
    RestAdapter restAdapter = new RestAdapter.Builder()
        .setConverter(jacksonConverter)
        .setEndpoint("https://api.example.com/")
        .build();

干得漂亮! 以后你创建的所有RestAdapter都将使用 JacksonConverter 来处理 JSON.

如果你遇到任何问题或困难, 请 Twitter @futurestud_io.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容