json string 格式_Retrofit同时解析JSON和XML数据格式
前言
Android开发中,我们会经常遇到前端需要解析两种数据格式(json和xml),比如自己服务器返回的是json格式的数据,我们做微信登录的时候,微信返回的格式又是xml格式的。我们可以通过自己编写Retrofit的ConverterFactory来做到可以同时解析两种数据格式。
代码
1.一般我们实例化retrofit实例的时候,都会传入GsonConverterFactory,如果我们需要同时解析两种格式,我们需要重写Converter.Factory()类
2.引入依赖包:
com.squareup.retrofit2:converter-simplexml是retrofit帮我们解析xml的依赖
implementation 'com.squareup.retrofit2:retrofit:2.6.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.retrofit2:converter-simplexml:2.4.0'
3.重写Converter.Factory()类,在responseBodyConverter方法中,判断到底是那种数据格式然后对应解析。
class JsonOrXmlConverterFactory : Converter.Factory() { private val xmlFactory:Converter.Factory by lazy { SimpleXmlConverterFactory.create() } private val jsonFactory: Converter.Factory by lazy { GsonConverterFactory.create() } companion object { fun create():JsonOrXmlConverterFactory { return JsonOrXmlConverterFactory() } } override fun requestBodyConverter( type: Type, parameterAnnotations: Array, methodAnnotations: Array, retrofit: Retrofit ): Converter? { return super.requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit) } override fun responseBodyConverter( type: Type, annotations: Array, retrofit: Retrofit ): Converter? { for(annotation in annotations) { if(annotation !is ResponseFormat) { continue } val value = annotation.value if (ResponseFormat.JSON == value) { return jsonFactory.responseBodyConverter(type, annotations, retrofit) } else if (ResponseFormat.XML == value) { return xmlFactory.responseBodyConverter(type, annotations, retrofit) } } return null }}
4.添加ResponseFormat注解,需要在HttpService中告诉请求到底返回的是xml还是json:
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)@Retention(AnnotationRetention.RUNTIME)annotation class ResponseFormat(val value: String = "json") { companion object { const val JSON = "json" const val XML = "xml" }}
5.Httpservice注解添加:
(1)当服务端返回格式为json时,ResponseFormat不需要添加参数,默认为json:
@ResponseFormat @FormUrlEncoded @POST("v1/user/getUser2") suspend fun getUser(@Field("openid") openid: String) : ReponseServer
(2)当服务器返回xml时,@ResponseFormat(value = ResponseFormat.XML)添加参数。告诉JsonOrXmlConverterFactory此时需要解析xml。
@ResponseFormat(value = ResponseFormat.XML) @POST("unifiedorder") suspend fun wxPrePay(@Body route:RequestBody) : WXPayReponse @ResponseFormat(value = ResponseFormat.XML) @POST("orderquery") suspend fun wxPayOrderQuery(@Body route: RequestBody) : WXOrderReponse
总结:
到此我们可以通过Retrofit解析json和xml格式,如果大家有疑问或者不足之处,可以在下方评论留言。
json string 格式_Retrofit同时解析JSON和XML数据格式相关推荐
- json string 格式_自己动手实现一个简单的JSON解析器
作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...
- 解析json数据_Retrofit同时解析JSON和XML数据格式
前言 Android开发中,我们会经常遇到前端需要解析两种数据格式(json和xml),比如自己服务器返回的是json格式的数据,我们做微信登录的时候,微信返回的格式又是xml格式的.我们可以通过自己 ...
- Oracle怎么获取json类型字符串值,sql解析json格式字段 如何获取json中某个字段的值?...
java将json数据解析为sql语句?小编给你倒一杯热水.可你惦记着其他饮料,所以你将它放置一旁.等你想起那杯水时,可惜它已经变得冰冷刺骨. 图片中是json数据,每个数据的开头都有表名称,操作类型 ...
- oracle解析json格式字段,sql解析json格式字段
java将json数据解析为sql语句? 图片中是json数据,每个数据的开头都有表名称,操作类型,后面是数据,import java.util.Iterator;import java.util.S ...
- json string 格式_GO小知识之如何做JSON美化
经常有些小知识想分享出来,但又构不成体系,一直觉得文章形式发出不太合适.准备以 "知乎想法" 分享出来,但发现代码展示不太友好.还是发文章吧,该类分享将以 "小知识&qu ...
- python string indices must be_Python解析json时提示“string indices must be integers”问题解决方法...
本文实例讲述了Python解析json时提示"string indices must be integers"问题解决方法.分享给大家供大家参考,具体如下: import json ...
- js html 处理json数据,JS中Json数据的处理和解析JSON数据的方法详解
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...
- c语言json结构体_C语言解析JSON源码
2020-01-09 关键字:cJSON.linux JSON解析 JSON 是一种在互联网领域内很常用的轻量级数据交换协议. 它与 XML 的地位差不多,但就笔者而言,笔者更喜欢 JSON 的风格, ...
- sql解析json oracle,oracle 11g plsql解析json数据示例1
以下存储过程将数据库表中的clob类型字段(存储的内容为对应Json格式数据)读取出来,对其解析,进行相关业务操作 CREATE OR REPLACE PROCEDURE xq_midso_gen(p ...
最新文章
- TitanDB GC详细实现原理 及其 引入的问题
- 干掉MySQL!阿里云MVP专家的分库分表设计,搞得太棒了!
- 浅谈netbios及其相关内容
- 二叉树 -php实现先序、中序、后序遍历二叉树
- string类有可以调换方向的函数吗_String类中常用的操作
- 46. PHP 数据库
- 使用JavaScript在页面打印系统当前时间
- Cplex的安装和使用实例
- JavaAndroid开发视频教程汇总
- 关于改进邮政编码的建议 2018-03-08
- iTunes出现“iTunes不能读取iPhone的内容,请前往iPhone偏好设置的摘要选项卡,然后点击“恢复””的解决办法
- 曼德博集合|最直观的数学之美——用Python看到“上帝的指纹”
- Win10右键菜单管理工具
- java scp 文件夹_如何用 scp命令创建文件夹
- linux如何结束at命令,Linux命令总结--at命令(atq.atrm)
- mac电脑usb连接android手机,Android安卓设备连接Mac的方法
- 服务器巡检都做什么工作,巡检的手段是什么?
- c语言主函数调用函数
- 代理模式(Proxy Design Pattern)及代码实现
- BurpSuite插件
热门文章
- oracle全角括号忽略,Oracle中SQL查询语句日文不区分全角/半角
- 放置奇兵公会副本攻略_放置奇兵维萨配什么魔兽,放置奇兵装备怎么获得-放置奇兵攻略...
- 39种语言编写的Hello World程序
- java常用设计模式 看了她,改变你的一生~~~
- computed 计算选项
- transform对定位元素的影响
- 理解$watch ,$apply 和 $digest --- 理解数据绑定过程
- JAVA-WEB-错误之-'OPTION SQL_SELECT_LIMIT=DEFAULT'
- MongoDB Replica Set 选举过程
- Windows核心编程学习九:利用内核对象进行线程同步