【问题标题】:How to access a field in a nested json response with retrofit如何通过改造访问嵌套 json 响应中的字段
【发布时间】:2021-07-13 22:06:44
【问题描述】:

我正在使用改造来解析 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”,这种方式不起作用。如何访问它?

【问题讨论】:

  • 您的数据类不对 JSON 建模。您的课程有列表,但没有列表。
  • @CommonsWare 哦,是的,我修好了
  • 另外,AnimeResponse 不应包含列表,因为 JSON 不包含列表。

标签: android kotlin retrofit


【解决方案1】:

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

为:

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
)

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

【讨论】:

  • 谢谢,我会序列化它们。一旦用户在 searchByName 函数 ($query&limit=10) 中添加他们的查询,该 url 应该可以工作。但我仍然无法找到那里的图像,你知道我怎么能在这里做到这一点:val images = Anime?.results?.image_url ?:emptyList()
猜你喜欢
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 2019-10-11
  • 2020-09-29
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
相关资源
最近更新 更多