当使用这种特殊情况将 Json 解析为 Object 时,您应该自己自定义 Json Deserializer。
这里我使用 Gson 库将 Json 解析为 Object。
首先,使用 Gson 创建一个自定义的 Json Deserializer。如下:
PokemonResponse.kt
data class PokemonResponse(
val pokemonMap: List<StringReleasedPokemonModel>
)
data class ReleasedPokemonModel(
val id: Int,
val name: String
)
GsonHelper.kt
object GsonHelper {
fun create(): Gson = GsonBuilder().apply {
registerTypeAdapter(PokemonResponse::class.java, PokemonType())
setLenient()
}.create()
private class PokemonType : JsonDeserializer<PokemonResponse> {
override fun deserialize(
json: JsonElement?,
typeOfT: Type?,
context: JsonDeserializationContext?
): PokemonResponse {
val list = mutableListOf<ReleasedPokemonModel>()
// Get your all key
val keys = json?.asJsonObject?.keySet()
keys?.forEach { key ->
// Get your item with key
val item = Gson().fromJson<ReleasedPokemonModel>(
json.asJsonObject[key],
object : TypeToken<ReleasedPokemonModel>() {}.type
)
list.add(item)
}
return PokemonResponse(list)
}
}
}
接下来我将创建一个GsonConverterFactory,以便我可以addConvertFactory 进行改造。
val gsonConverterFactory = GsonConverterFactory.create(GsonHelper.create())
现在我将添加改造。
val retrofit = Retrofit.Builder()
// Custom your Retrofit
.addConverterFactory(gsonConverterFactory) // Add GsonConverterFactoty
.build()
最后在 ApiService 中,您的响应现在将返回类型 PokemonResponse。
interface ApiService {
@GET("your_link")
suspend fun getGenres(): PokemonResponse
}