Browse Source

支持非固定格式Json解析

drake 3 năm trước cách đây
mục cha
commit
d2a29423c5

+ 1 - 1
sample/src/main/java/com/drake/net/sample/converter/FastJsonConverter.kt

@@ -22,7 +22,7 @@ import java.lang.reflect.Type
 
 class FastJsonConverter : JSONConvert(code = "code", message = "msg", success = "0") {
 
-    override fun <S> String.parseBody(succeed: Type): S? {
+    override fun <R> String.parseBody(succeed: Type): R? {
         return JSON.parseObject(this, succeed)
     }
 }

+ 4 - 7
sample/src/main/java/com/drake/net/sample/converter/GsonConverter.kt

@@ -16,19 +16,16 @@
 
 package com.drake.net.sample.converter
 
+import com.drake.net.convert.JSONConvert
 import com.drake.net.convert.NetConverter
 import com.google.gson.GsonBuilder
 import okhttp3.Response
 import java.lang.reflect.Type
 
-class GsonConverter : NetConverter {
+class GsonConverter : JSONConvert() {
     private val gson = GsonBuilder().serializeNulls().create()
 
-    override fun <R> onConvert(succeed: Type, response: Response): R? {
-        return try {
-            NetConverter.DEFAULT.onConvert<R>(succeed, response)
-        } catch (e: Exception) {
-            gson.fromJson(response.body?.string(), succeed)
-        }
+    override fun <R> String.parseBody(succeed: Type): R? {
+        return gson.fromJson(this, succeed)
     }
 }

+ 2 - 2
sample/src/main/java/com/drake/net/sample/converter/MoshiConverter.kt

@@ -23,7 +23,7 @@ import java.lang.reflect.Type
 class MoshiConverter : JSONConvert(code = "code", message = "msg", success = "0") {
     private val moshi = Moshi.Builder().build()
 
-    override fun <S> String.parseBody(succeed: Type): S? {
-        return moshi.adapter<S>(succeed).fromJson(this)
+    override fun <R> String.parseBody(succeed: Type): R? {
+        return moshi.adapter<R>(succeed).fromJson(this)
     }
 }

+ 20 - 15
sample/src/main/java/com/drake/net/sample/converter/SerializationConverter.kt

@@ -9,12 +9,13 @@ import com.drake.net.exception.RequestParamsException
 import com.drake.net.exception.ResponseException
 import com.drake.net.exception.ServerResponseException
 import com.drake.net.request.kType
-import kotlinx.serialization.SerializationException
 import kotlinx.serialization.json.Json
 import kotlinx.serialization.serializer
 import okhttp3.Response
+import org.json.JSONException
 import org.json.JSONObject
 import java.lang.reflect.Type
+import kotlin.reflect.KType
 
 class SerializationConverter(
     val success: String = "0",
@@ -31,24 +32,24 @@ class SerializationConverter(
         try {
             return NetConverter.DEFAULT.onConvert<R>(succeed, response)
         } catch (e: ConvertException) {
-
             val code = response.code
             when {
                 code in 200..299 -> { // 请求成功
-                    val body = response.body?.string() ?: return null
-                    if (succeed === String::class.java) return body as R
-                    val jsonObject = JSONObject(body) // 获取JSON中后端定义的错误码和错误信息
-                    if (jsonObject.getString(this.code) == success) { // 对比后端自定义错误码
-                        return run {
-                            val kType = response.request.kType() ?: return null
-                            try {
-                                jsonDecoder.decodeFromString(Json.serializersModule.serializer(kType), jsonObject.getString("data")) as R
-                            } catch (e: SerializationException) {
-                                throw ConvertException(response, cause = e)
-                            }
+                    val bodyString = response.body?.string() ?: return null
+                    val kType = response.request.kType() ?: return null
+                    return try {
+                        val json = JSONObject(bodyString) // 获取JSON中后端定义的错误码和错误信息
+                        if (json.getString(this.code) == success) { // 对比后端自定义错误码
+                            bodyString.parseBody<R>(kType)
+                        } else { // 错误码匹配失败, 开始写入错误异常
+                            val errorMessage = json.optString(
+                                message,
+                                NetConfig.app.getString(com.drake.net.R.string.no_error_message)
+                            )
+                            throw ResponseException(response, errorMessage)
                         }
-                    } else { // 错误码匹配失败, 开始写入错误异常
-                        throw ResponseException(response, jsonObject.optString(message, NetConfig.app.getString(com.drake.net.R.string.no_error_message)))
+                    } catch (e: JSONException) { // 固定格式JSON分析失败直接解析JSON
+                        bodyString.parseBody<R>(kType)
                     }
                 }
                 code in 400..499 -> throw RequestParamsException(response) // 请求参数错误
@@ -57,4 +58,8 @@ class SerializationConverter(
             }
         }
     }
+
+    fun <R> String.parseBody(succeed: KType): R? {
+        return jsonDecoder.decodeFromString(Json.serializersModule.serializer(succeed), this) as R
+    }
 }

+ 1 - 1
sample/src/main/java/com/drake/net/sample/ui/fragment/converter/SerializationConvertFragment.kt

@@ -39,7 +39,7 @@ class SerializationConvertFragment : BaseConvertFragment(R.layout.fragment_custo
         """.trimIndent()
 
         scopeNetLife {
-            val userList = Get<List<UserModel>>("list-data") {
+            val userList = Get<List<UserModel>>("list") {
                 // 该转换器直接解析JSON中的data字段, 而非返回的整个JSON字符串
                 converter = SerializationConverter() // 单例转换器, 此时会忽略全局转换器
             }.await()