如何通过改造访问嵌套 json 响应中的字段

时间:2021-07-13 22:06:44

标签: android kotlin retrofit

我正在使用改造来解析 json 响应,但我不确定如何访问嵌套响应中的字段。 响应有一个“结果”字段,该字段导致嵌套列表,其中包含我想要的字段之一 (https://api.jikan.moe/v3/search/anime?q=free)。

我编写了这些类来处理响应:

data class AnimeResponse(
    val results: List<AnimeResultsResponse>
)
data class AnimeResponseNumbers(
    @SerializedName("0") var zero: List<AnimeResultsResponse>,
    @SerializedName("1") var one: List<AnimeResultsResponse>,
    @SerializedName("2") var two: List<AnimeResultsResponse>,
    @SerializedName("3") var three: List<AnimeResultsResponse>,
    @SerializedName("4") var four: List<AnimeResultsResponse>,
    @SerializedName("5") var five: List<AnimeResultsResponse>,
    @SerializedName("6") var six: List<AnimeResultsResponse>,
    @SerializedName("7") var seven: List<AnimeResultsResponse>,
    @SerializedName("8") var eight: List<AnimeResultsResponse>,
    @SerializedName("9") var nine: List<AnimeResultsResponse>,
    @SerializedName("10") var ten: List<AnimeResultsResponse>,
   
)
data class AnimeResultsResponse(
    var mal_id: String,
    var url: String,
    var image_url: String,
    var title: String,
    var airing: Boolean,
    var synopsis: String,
    var type: String,
    var episodes: Int,
    var score: Float,
    var start_date: String,
    var end_date: String,
    var member: Int,
    var rated: String
)

然后我在另一个文件中管理 get 请求:

interface APIService {
    @GET
    suspend fun getAnimeByCategory(@Url url:String):Response<AnimeResponse>
}

这就是我应该如何通过改造和协程获得响应:

private fun getRetrofit():Retrofit{
        return Retrofit.Builder()
            .baseUrl("https://api.jikan.moe/v3/search/anime?q=")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

private fun searchByName(query:String){
        CoroutineScope(Dispatchers.IO).launch {
            val call = getRetrofit().create(APIService::class.java).getAnimeByCategory("$query&limit=10")
            val anime = call.body()
            runOnUiThread{
                if(call.isSuccessful) {
                    val images = anime?.results?.image_url ?: emptyList()
                    animeImages.clear()
                    animeImages.addAll(images)
                    adapter.notifyDataSetChanged()
                }else{
                    showError()
                }
            }
            hideKeyboard()
        }
    }

问题是这一行:

val images = anime?.results?.image_url ?: emptyList()

我不确定如何访问响应中“结果”字段内的“image_url”,这种方式不起作用。我如何访问它?

1 个答案:

答案 0 :(得分:0)

我认为您应该序列化模型类中的所有字段,

对于:

data class AnimeResponse(
val results: List<AnimeResultsResponse>
)

应该变成:

data class AnimeResponse(
@SerializedName("results") val results: List<AnimeResultsResponse>
)

对于AnimeResultsResponse 应该是:

data class AnimeResultsResponse(
@SerializedName("mal_id") var mal_id: String,
@SerializedName("url") var url: String,
@SerializedName("image_url") var image_url: String,
@SerializedName("title") var title: String,
@SerializedName("airing") var airing: Boolean,
@SerializedName("synopsis") var synopsis: String,
@SerializedName("type") var type: String,
@SerializedName("episodes") var episodes: Int,
@SerializedName("score") var score: Float,
@SerializedName("start_date") var start_date: String,
@SerializedName("end_date") var end_date: String,
@SerializedName("member") var member: Int,
@SerializedName("rated") var rated: String
)

也不要忘记更新代码中的网址,因为 https://api.jikan.moe/v3/search/anime?q= 返回错误 404