前言

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数据格式相关推荐

  1. json string 格式_自己动手实现一个简单的JSON解析器

    作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  2. 解析json数据_Retrofit同时解析JSON和XML数据格式

    前言 Android开发中,我们会经常遇到前端需要解析两种数据格式(json和xml),比如自己服务器返回的是json格式的数据,我们做微信登录的时候,微信返回的格式又是xml格式的.我们可以通过自己 ...

  3. Oracle怎么获取json类型字符串值,sql解析json格式字段 如何获取json中某个字段的值?...

    java将json数据解析为sql语句?小编给你倒一杯热水.可你惦记着其他饮料,所以你将它放置一旁.等你想起那杯水时,可惜它已经变得冰冷刺骨. 图片中是json数据,每个数据的开头都有表名称,操作类型 ...

  4. oracle解析json格式字段,sql解析json格式字段

    java将json数据解析为sql语句? 图片中是json数据,每个数据的开头都有表名称,操作类型,后面是数据,import java.util.Iterator;import java.util.S ...

  5. json string 格式_GO小知识之如何做JSON美化

    经常有些小知识想分享出来,但又构不成体系,一直觉得文章形式发出不太合适.准备以 "知乎想法" 分享出来,但发现代码展示不太友好.还是发文章吧,该类分享将以 "小知识&qu ...

  6. python string indices must be_Python解析json时提示“string indices must be integers”问题解决方法...

    本文实例讲述了Python解析json时提示"string indices must be integers"问题解决方法.分享给大家供大家参考,具体如下: import json ...

  7. js html 处理json数据,JS中Json数据的处理和解析JSON数据的方法详解

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  8. c语言json结构体_C语言解析JSON源码

    2020-01-09 关键字:cJSON.linux JSON解析 JSON 是一种在互联网领域内很常用的轻量级数据交换协议. 它与 XML 的地位差不多,但就笔者而言,笔者更喜欢 JSON 的风格, ...

  9. sql解析json oracle,oracle 11g plsql解析json数据示例1

    以下存储过程将数据库表中的clob类型字段(存储的内容为对应Json格式数据)读取出来,对其解析,进行相关业务操作 CREATE OR REPLACE PROCEDURE xq_midso_gen(p ...

最新文章

  1. TitanDB GC详细实现原理 及其 引入的问题
  2. 干掉MySQL!阿里云MVP专家的分库分表设计,搞得太棒了!
  3. 浅谈netbios及其相关内容
  4. 二叉树 -php实现先序、中序、后序遍历二叉树
  5. string类有可以调换方向的函数吗_String类中常用的操作
  6. 46. PHP 数据库
  7. 使用JavaScript在页面打印系统当前时间
  8. Cplex的安装和使用实例
  9. JavaAndroid开发视频教程汇总
  10. 关于改进邮政编码的建议 2018-03-08
  11. iTunes出现“iTunes不能读取iPhone的内容,请前往iPhone偏好设置的摘要选项卡,然后点击“恢复””的解决办法
  12. 曼德博集合|最直观的数学之美——用Python看到“上帝的指纹”
  13. Win10右键菜单管理工具
  14. java scp 文件夹_如何用 scp命令创建文件夹
  15. linux如何结束at命令,Linux命令总结--at命令(atq.atrm)
  16. mac电脑usb连接android手机,Android安卓设备连接Mac的方法
  17. 服务器巡检都做什么工作,巡检的手段是什么?
  18. c语言主函数调用函数
  19. 代理模式(Proxy Design Pattern)及代码实现
  20. BurpSuite插件

热门文章

  1. oracle全角括号忽略,Oracle中SQL查询语句日文不区分全角/半角
  2. 放置奇兵公会副本攻略_放置奇兵维萨配什么魔兽,放置奇兵装备怎么获得-放置奇兵攻略...
  3. 39种语言编写的Hello World程序
  4. java常用设计模式 看了她,改变你的一生~~~
  5. computed 计算选项
  6. transform对定位元素的影响
  7. 理解$watch ,$apply 和 $digest --- 理解数据绑定过程
  8. JAVA-WEB-错误之-'OPTION SQL_SELECT_LIMIT=DEFAULT'
  9. MongoDB Replica Set 选举过程
  10. Windows核心编程学习九:利用内核对象进行线程同步