Retrofit动态设置支持JSON和XML格式转换工厂

  • Retrofit-Converter.Factory转换工厂
  • 导入相关依赖
  • 创建ConverterFormat枚举类
  • 声明RequestConverter注解
  • 声明ResponseConverter注解
  • 自定义JsonOrXmlConverterFactory
  • 使用方法

日常开发中,网络请求一般数据传输协议格式一般都是固定的,JSON或XML等。但总有一些例外,一个项目中有多种格式,也算是Android开发人员比较头疼的了。

Retrofit-Converter.Factory转换工厂

Retrofit是常用且功能强大的网络请求框架,通过Converter.Factory可以将Bean转为RequestBody,ResponseBody转为Bean。
官方也提供了一些转换工厂,供我们快速开发:retrofit-converters

导入相关依赖

implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
implementation 'com.squareup.retrofit2:converter-simplexml:2.6.2'

版本号可替换成最新版本。
提示:SimpleXml已经被官方弃用,官方推荐使用JAXB,当时测试JAXB使用时报错。converter-jaxb

创建ConverterFormat枚举类

/*** 数据解析的方式* json或者xml*/
enum class ConverterFormat {JSON,XML
}

声明RequestConverter注解

@Target(AnnotationTarget.FUNCTION
)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
annotation class RequestConverter(val format: ConverterFormat = ConverterFormat.JSON)

默认JSON格式。

声明ResponseConverter注解

@Target(AnnotationTarget.FUNCTION
)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
annotation class ResponseConverter(val format: ConverterFormat = ConverterFormat.JSON)

默认JSON格式。

自定义JsonOrXmlConverterFactory

class JsonOrXmlConverterFactory private constructor() : Converter.Factory() {private var jsonFactory: Converter.Factoryprivate var xmlFactory: Converter.Factoryinit {val gson = GsonBuilder().serializeNulls().create()jsonFactory = GsonConverterFactory.create(gson)xmlFactory = SimpleXmlConverterFactory.createNonStrict()}companion object {fun create() = JsonOrXmlConverterFactory()}override fun requestBodyConverter(type: Type,parameterAnnotations: Array<Annotation>,methodAnnotations: Array<Annotation>,retrofit: Retrofit): Converter<*, RequestBody>? {for (annotation in methodAnnotations) {if (annotation is RequestConverter) {if (annotation.format == ConverterFormat.JSON) {return jsonFactory.requestBodyConverter(type,parameterAnnotations,methodAnnotations,retrofit)} else if (annotation.format == ConverterFormat.XML) {return xmlFactory.requestBodyConverter(type,parameterAnnotations,methodAnnotations,retrofit)}}}return jsonFactory.requestBodyConverter(type,parameterAnnotations,methodAnnotations,retrofit)}override fun responseBodyConverter(type: Type,annotations: Array<Annotation>,retrofit: Retrofit): Converter<ResponseBody, *>? {for (annotation in annotations) {if (annotation is ResponseConverter) {if (annotation.format == ConverterFormat.JSON) {return jsonFactory.responseBodyConverter(type, annotations, retrofit)} else if (annotation.format == ConverterFormat.XML) {return xmlFactory.responseBodyConverter(type, annotations, retrofit)}}}return jsonFactory.responseBodyConverter(type, annotations, retrofit)}
}

如果没找到相关注解,则使用JSON格式。

使用方法

  1. 创建Retrofit实例时通过addConverterFactory添加JsonOrXmlConverterFactory
fun init() {val retrofitBuilder = Retrofit.Builder().addConverterFactory(JsonOrXmlConverterFactory.create())val retrofit = retrofitBuilder.build()val apiService = retrofit.create(ApiService::class.java)
}
  1. 在接口上添加注解
@POST
@RequestConverter(ConverterFormat.XML)
@ResponseConverter(ConverterFormat.JSON)
@Headers("Connection: Close")
fun netRelayCtrl(@Url url: String, @Body bean: NetRelayCtrlBean): Observable<NetRelayCtrlResultBean>

不添加RequestConverter、ResponseConverter注解,则默认使用JSON解析。如有错误,还望指正。

Retrofit动态设置支持JSON和XML格式转换工厂相关推荐

  1. .NetCore获取Json和Xml格式的配置信息

    本篇将和大家分享的是:如何获取Json和Xml格式的配置信息,主要介绍的是Configuration扩展方法的使用,因为netcore的web应用在Startup中已经默认嵌入appsettings. ...

  2. ajax请求json和xml数据及对json和xml格式数据的解析

    ajax请求json和xml数据及对json和xml格式数据的解析 一.ajax请求json数据并解析 ajax的写法: json数据解析: 请求json经常出现的跨域报错: 二.ajax请求xml数 ...

  3. node 微信开发 json转xml 格式

    在微信开发中,大多请求接口格式需要传xml,所以提供一下微信适用的json转xml格式代码: json2Xml: (json) => {let _xml = '';Object.keys(jso ...

  4. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

  5. php处理微信返回xml数据,php将微信返回的xml格式转换成数组

    废话不多说直接上代码 代码<?php header("Content-type: text/html; charset=utf-8"); date_default_timez ...

  6. 数组和JSON之间的格式转换

    数组和JSON之间的格式转换 主要代码: const a = JSON.stringify(jsonStrings) //object转json const c = JSON.parse(a) //j ...

  7. retrofit动态设置json或xml或其他转换工厂

    文章目录 retrofit转换工厂介绍 可以混用的转换工厂CompositeConverterFactory 声明工厂CompositeConverterFactory 声明注解@RequestCon ...

  8. MariaDB 10.0.X中,动态列支持 JSON 格式来获取数据

    MariaDB 10.0.X中,动态列(Dynamic Columns),可以支持 JSON 格式来获取数据. 为了兼容传统SQL语法,MariaDB 10和MySQL5.7支持原生JSON格式,即关 ...

  9. SpringBoot使用教程【1】Restful API设计 返回json,xml格式...

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qingfeng812/article/details/74738885 效果展示: 浏览器截图 ht ...

最新文章

  1. java windows wifi_[转] win7 电脑无线网变身WiFi热点
  2. 服务器文件协议,文件服务器协议
  3. java数据结构有哪些_java有哪些数据结构?
  4. PROC系列之---/proc/pid/stat
  5. CANVAS运用-对图片的压缩上传(仅针对移动浏览器)
  6. 云计算基础知识:CPU虚拟化
  7. SQL UNION 和 UNION ALL 操作符(mysql)
  8. TDD:MS自带的单元测试 之 线程模型和执行顺序
  9. c语言 用一维数组存储二叉树,用一维数组存储二叉树时,总是以前序遍历顺序存储结点。( ? )...
  10. php实现注册登陆验证
  11. mysql 14.12_[mysql] 14.12 innodb下的 磁盘I/O与文件空间管理方式
  12. ADB工具 获取ROOT权限及复制文件方法
  13. 【鲲鹏来了】华为云鲲鹏弹性云服务器 KC1一文全掌握(2)
  14. 很有趣的Java分形绘制
  15. 在线解析解码jwt token工具
  16. Bailian2715 谁拿了最多奖学金【分段计算处理】(Vijos P1001)
  17. Python之txt数据导入
  18. java-学生管理系统源代码
  19. 安富莱C语言编码规范
  20. 【从零开始】手写数字识别降维可视化学习笔记

热门文章

  1. 算法笔记2143ProblemF 迷瘴
  2. STL(标准模板库)--容器(一)
  3. javaWeb-JDBC
  4. thinkphp5 return 返回空_网红饮品大杯约1/3是空的,店员:是公司设计的中空隔冷层...
  5. python中set()函数的用法
  6. esp https连接出现 -0x2700 或者X509_verify_cert() returned -9984 (-0x2700)
  7. 自定义View——闹钟
  8. 浅析加密算法二【Vigenere密码】
  9. corelcad 2019mac中文激活
  10. 无法安装64位版本的office_抛弃 32 位!微软 Win10 版本 2004 OEM 预装仅发布 64 位版本...