Retrofit动态设置支持JSON和XML格式转换工厂
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格式。
使用方法
- 创建Retrofit实例时通过addConverterFactory添加JsonOrXmlConverterFactory
fun init() {val retrofitBuilder = Retrofit.Builder().addConverterFactory(JsonOrXmlConverterFactory.create())val retrofit = retrofitBuilder.build()val apiService = retrofit.create(ApiService::class.java)
}
- 在接口上添加注解
@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格式转换工厂相关推荐
- .NetCore获取Json和Xml格式的配置信息
本篇将和大家分享的是:如何获取Json和Xml格式的配置信息,主要介绍的是Configuration扩展方法的使用,因为netcore的web应用在Startup中已经默认嵌入appsettings. ...
- ajax请求json和xml数据及对json和xml格式数据的解析
ajax请求json和xml数据及对json和xml格式数据的解析 一.ajax请求json数据并解析 ajax的写法: json数据解析: 请求json经常出现的跨域报错: 二.ajax请求xml数 ...
- node 微信开发 json转xml 格式
在微信开发中,大多请求接口格式需要传xml,所以提供一下微信适用的json转xml格式代码: json2Xml: (json) => {let _xml = '';Object.keys(jso ...
- SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转
SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...
- php处理微信返回xml数据,php将微信返回的xml格式转换成数组
废话不多说直接上代码 代码<?php header("Content-type: text/html; charset=utf-8"); date_default_timez ...
- 数组和JSON之间的格式转换
数组和JSON之间的格式转换 主要代码: const a = JSON.stringify(jsonStrings) //object转json const c = JSON.parse(a) //j ...
- retrofit动态设置json或xml或其他转换工厂
文章目录 retrofit转换工厂介绍 可以混用的转换工厂CompositeConverterFactory 声明工厂CompositeConverterFactory 声明注解@RequestCon ...
- MariaDB 10.0.X中,动态列支持 JSON 格式来获取数据
MariaDB 10.0.X中,动态列(Dynamic Columns),可以支持 JSON 格式来获取数据. 为了兼容传统SQL语法,MariaDB 10和MySQL5.7支持原生JSON格式,即关 ...
- SpringBoot使用教程【1】Restful API设计 返回json,xml格式...
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qingfeng812/article/details/74738885 效果展示: 浏览器截图 ht ...
最新文章
- java windows wifi_[转] win7 电脑无线网变身WiFi热点
- 服务器文件协议,文件服务器协议
- java数据结构有哪些_java有哪些数据结构?
- PROC系列之---/proc/pid/stat
- CANVAS运用-对图片的压缩上传(仅针对移动浏览器)
- 云计算基础知识:CPU虚拟化
- SQL UNION 和 UNION ALL 操作符(mysql)
- TDD:MS自带的单元测试 之 线程模型和执行顺序
- c语言 用一维数组存储二叉树,用一维数组存储二叉树时,总是以前序遍历顺序存储结点。( ? )...
- php实现注册登陆验证
- mysql 14.12_[mysql] 14.12 innodb下的 磁盘I/O与文件空间管理方式
- ADB工具 获取ROOT权限及复制文件方法
- 【鲲鹏来了】华为云鲲鹏弹性云服务器 KC1一文全掌握(2)
- 很有趣的Java分形绘制
- 在线解析解码jwt token工具
- Bailian2715 谁拿了最多奖学金【分段计算处理】(Vijos P1001)
- Python之txt数据导入
- java-学生管理系统源代码
- 安富莱C语言编码规范
- 【从零开始】手写数字识别降维可视化学习笔记
热门文章
- 算法笔记2143ProblemF 迷瘴
- STL(标准模板库)--容器(一)
- javaWeb-JDBC
- thinkphp5 return 返回空_网红饮品大杯约1/3是空的,店员:是公司设计的中空隔冷层...
- python中set()函数的用法
- esp https连接出现 -0x2700 或者X509_verify_cert() returned -9984 (-0x2700)
- 自定义View——闹钟
- 浅析加密算法二【Vigenere密码】
- corelcad 2019mac中文激活
- 无法安装64位版本的office_抛弃 32 位!微软 Win10 版本 2004 OEM 预装仅发布 64 位版本...