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

前言

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

代码

1.一般我们实例化retrofit实例的时候,都会传入GsonConverterFactory,如果我们需要同时解析两种格式,我们需要重写Converter.Factory()类

524d754da1de73c3918254e7109097ca.png

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格式,如果大家有疑问或者不足之处,可以在下方评论留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORACLE 小时值必须介于1和12之间 解决方法

ORACLE数据库查询语句: "select * from dual where time>to_date(2012-10-29 19:45:34,yyyy-mm-dd HH:mi:ss)"当执行时,会抛出错误:ORA-01849: 小时值必须介于 1 和 12 之间 01849. 00000 - "hour must be between 1 and 1…

jenkins+svn+maven+ssh 部署配置详细记录

2019独角兽企业重金招聘Python工程师标准>>> 先简单记录一下,后面再慢慢完善。 1、环境 jdk 1.7.0_45 maven 3.1.1 jenkins 2.3.21 jdk和maven的安装就不必多说了,主要是jenkins的安装需要说下,jenkins有war包和yum还有rpm等安装方…

k8s安装sqlite3_kubernetes环境部署单节点redis数据库的方法

kubernetes部署redis数据库(单节点)redis简介Redis 是我们常用的非关系型数据库,在项目开发、测试、部署到生成环境时,经常需要部署一套 Redis 来对数据进行缓存。这里介绍下如何在 Kubernetes 环境中部署用于开发、测试的环境的 Redis 数据库&#xff0…

oracle 都是parallel惹的祸【1-2分钟出结果变1-2秒】

原文:http://blog.csdn.net/shushugood/article/details/9000628 -------------------------------------------------------- 该项目是中国联通xxxx话务系统,我的架构设计需求设计,运维保障数据库开发,全套服务。 在今天开发完毕…

二叉搜索树(BST树)的简单实现

#include <stdlib.h>template<typename T>class CBinSTree;template <typename T>class CTreeNode{//树节点类public:CTreeNode(const T& item,CTreeNode<T>* lptr NULL,CTreeNode<T>* rptr NULL):data(item),left(lptr),right(rptr){}CTr…

Oracle 创建 DBLink 的方法

原文出处&#xff1a;http://blog.csdn.net/davidhsing/article/details/6408770 ------------------- 1、如果需要创建全局 DBLink&#xff0c;则需要先确定用户有创建 dblink 的权限&#xff1a; [c-sharp] view plaincopy print?select * from user_sys_privs where privi…

eclipse init 配置

--设置最大的堆和最小堆大小.两者一样表示固定大小.这样可以防止老年代内存扩展造成额外的gc.当然也会多占一些内存.系统内存不足的慎用 -Xms512m -Xmx512m --加大年轻代内存.减少minor gc -Xmn164m --这个是永久代大小.默认是64M,增加到96M.固定大小,减少扩展造成的gc -XX:Per…

Oracle对表空间操作的sql

管理员给用户增加不限制表空间权限 grant unlimited tablespace to 用户; 查看表空间使用情况 SELECT a.tablespace_name "表空间名", total "表空间大小", free "表空间剩余大小", (total - free) "表空间使用大小", total / (…

IPKISS Tutorials------线路仿真

IPKISS------线路仿真 推荐阅读引言正文示例1------PDK中集成好的器件示例2------使用 i3.Circuit 框架示例3------i3.PCell 框架推荐阅读 Matplotlib ------ 纵坐标科学计数法含义 引言 我们知道,想要在 IPKISS 中进行仿真,首先需要对线路进行定义,但是我们知道,在 IPK…

Oracle Database 11g Express Edition使用限制,与其他版本的区别

Oracle Database 11g Express Edition是 Oracle 数据库的免费版本&#xff0c;支持标准版的大部分功能&#xff0c;11g Express Edition 提供 Windows 和 Linux 版本。 做为免费的 Oracle 数据库版本&#xff0c;Express Edition的限制是&#xff1a; 1&#xff09;最大数据库大…

c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数

一、前言本部分为C语言刷题系列中的第8节&#xff0c;主要讲解这几个知识点&#xff1a;复制构造函数和赋值运算符重载函数。欢迎大家提出意见、指出错误或提供更好的题目&#xff01;二、知识点讲解知识点1&#xff1a;复制构造函数1、当依据一个已存对象创建一个新对象时&…

ORACLE使用WITH AS和HINT MATERIALIZE优化SQL解决FILTER效率低下

原文&#xff1a;http://blog.csdn.net/liangweiwei130/article/details/37882503 ------------------------------------------------- 在做项目的过程中&#xff0c;一个页面使用类似如下的SQL查询数据&#xff0c;为了保密和使用方便&#xff0c;我把项目中有关的表名和字段…

面试题333

2019独角兽企业重金招聘Python工程师标准>>> 面试题333 博客分类&#xff1a; java 1、spring的缓存,mybatis缓存2、介绍下dubbo。A服务调用B服务&#xff0c;B服务又调用C服务,这种情况怎么办3、JVM监控工具有哪些&#xff0c;区别又是什么&#xff08;如能追上各个…

mysql vfp_用 VFP 连接 MYSQL 数据库

今天试了一下用 Visual FoxPro 连接 MySQL 数据库。首先在自己机子上架设 MySQL 数据库&#xff0c;就不多说了&#xff0c;我是直接用 XAMPP 架设的服务器。然后在 VFP 里输入命令&#xff1a;sqlhandle SQLSTRINGCONNECT("driver{MySQL ODBC 5.1 Driver};server127.0.0…

oracle中with的用法及用处

原文出处&#xff1a;http://blog.csdn.net/chenjinlin1/article/details/6572401 ---------------------------------------------------------------- WITH 用于一个语句中某些中间结果放在临时表空间的SQL语句 如 WITH channel_summary AS ( SELECT channels.channel_de…

xpath选择当前结点的子节点

2019独角兽企业重金招聘Python工程师标准>>> xpath选择当前结点的子节点 博客分类&#xff1a; 搜索引擎&#xff0c;爬虫 在通过selenium使用xpath选择节点的时候&#xff0c;可能会遇到这么一种情况&#xff1a;在指定的当前节点下搜索满足要求的节点。 node dri…

mysql中主从复制配置文件_MySQL主从复制 配置文件实例

1、主服务器配置文件# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html[mysqld]# Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70%…

SQL中,where 与 having 的性能比较

原文&#xff1a;http://blog.csdn.net/showshore/article/details/7263115 --------------------------------------------------------- 在做项目的过程中&#xff0c;使用sql语句时&#xff0c;很多时候会用到where或having。 看到国外一个论坛上有人提到两者性能比较的这个…

Spark 独立部署模式

2019独角兽企业重金招聘Python工程师标准>>> Spark 独立部署模式 博客分类&#xff1a; spark 除了在 Mesos 或 YARN 集群上运行之外, Spark 还提供一个简单的独立部署的模块。你通过手动开始master和workers 来启动一个独立的集群。你也可以利用我们提供的脚本 .…

mysql数据库的链接地址_常用数据库连接URL地址大全

1、Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID String user="test"; String password="test"; Con…