前言
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格式,如果大家有疑問或者不足之處,可以在下方評論留言。