我的大多數 API 呼叫都回傳如下內容:
{
"message": str,
"status": str,
"different_name_depending_on_endpoint":{
// bunch of stuff
},
}
如何使"different_name_depending_on_endpoint"鍵中的名稱通用?像這樣:
data class ReturnAPI<T>(
@SerializedName("message")
val message: String,
@SerializedName("status")
val status: String,
@SerializedName("how do I make this generic")
val data: T
)
否則,對于每個端點,我必須為 api 回傳創建一個單獨的資料類,并為該data欄位創建一個單獨的資料類,這是不切實際的。一定有辦法讓它通用,對吧?或者告訴Retrofit嘗試data用JSON檔案中不是message或status.
uj5u.com熱心網友回復:
或者告訴 Retrofit 嘗試用 JSON 檔案中不是訊息或狀態的任何其他內容填充資料欄位
是的,您可以為以下型別撰寫自定義反序列化器ReturnAPI:
@JsonAdapter(ReturnApiTypeAdapter::class)
data class ReturnAPI<T>(
val message: String,
val status: String,
val data: T
)
class ReturnApiTypeAdapter : JsonDeserializer<ReturnAPI<*>> {
@Throws(JsonParseException::class)
override fun deserialize(
json: JsonElement,
typeOfT: Type,
context: JsonDeserializationContext
): ReturnAPI<*>? {
if (json.isJsonNull) {
return null
}
val jsonObject = json.asJsonObject
// get actual type of Data
val typeOfData = (typeOfT as ParameterizedType)
.actualTypeArguments[0]
var message: String? = null
var status: String? = null
var data: Any? = null
for (key in jsonObject.keySet()) {
when (key) {
"message" -> message = jsonObject.getAsJsonPrimitive(key).asString
"status" -> status = jsonObject.getAsJsonPrimitive(key).asString
else -> data = context.deserialize(jsonObject.get(key), typeOfData)
}
}
// optional checks
check(message != null && status != null) {
"Failed parsing"
}
return ReturnAPI(message, status, data)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/432526.html
