【问题标题】:How do I get CatAPI to work in simple Android App如何让 CatAPI 在简单的 Android 应用程序中工作
【发布时间】:2020-12-05 03:23:57
【问题描述】:

我正在尝试让CatAPI 工作。我的代码正在编译和运行,Dog API(我成功实现)工作得很好。但是,每当我使用 CatAPI 的按钮时,都会出现此错误:

I/catError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

我想这与我尝试读取 JSON 的方式有关。但是,我不知道在这里做什么。 这是我的代码:

CatService.kt:

interface CatService{
    @GET("images/search")
    fun randomCat(): Call<Cat>

}

Cat.kt

class Cat (
    var id: String,
    var url: String,
    var breeds: List<Any>,
    var width: Int,
    var height: Int
)

MainActivity.kt:

private fun catFunction(){
    val retrofitCat = Retrofit.Builder()
        .baseUrl("https://api.thecatapi.com/v1/")
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    val catService: CatService = retrofitCat.create(CatService::class.java)
    val callCat = catService.randomCat().enqueue(object:Callback<Cat>{
        override fun onResponse(call: Call<Cat>, response: Response<Cat>) {
            val randomCat = response.body()!!

            Log.i("catMessage", randomCat.url)

            Picasso.get()
                .load(randomCat.url)
                .into(imgView)
        }

        override fun onFailure(call: Call<Cat>, t: Throwable) {
            Log.i("catError", t.toString())
        }})
}

谢谢!

【问题讨论】:

  • 它告诉你问题... cat api 正在返回一个 JSONArray 即 [{}, {}] 并且 dog 正在返回一个对象 {}
  • 谢谢@DavidKroukamp。但是,我不知道如何解决这个问题?这可能很愚蠢,但我仍然是初学者。我真的不知道在这里做什么。不过,我正在寻找更多关于它的信息。谢谢!
  • 查看我的回答@Isadora

标签: android json api kotlin


【解决方案1】:

您可能希望返回一个猫列表,即List&lt;Cat&gt; 作为JSONArray。

CatService.kt:

interface CatService{
    @GET("images/search")
    fun randomCat(): Call<List<Cat>>

}

你的实际enqueue:

val callCat = catService.randomCat().enqueue(object : Callback<List<Cat>> {
    override fun onResponse(call: Call<List<Cat>>, response: Response<List<Cat>>) {
        val randomCat = response.body()!!

        Log.i("catMessage", randomCat[0].url)

        Picasso.get()
            .load(randomCat[0].url) // get the first result as the API states
            .into(imgView)
    }

    override fun onFailure(call: Call<List<Cat>>, t: Throwable) {
        Log.i("catError", t.toString())
    }
})

注意从 Call&lt;Cat&gt; 到 Call&lt;List&lt;Cat&gt;&gt; 和 Response&lt;Cat&gt; 到 Response&lt;List&lt;Cat&gt;&gt; 的所有更改。

【讨论】:

  • 谢谢!这行得通!我不知道如何处理 Android 上的列表,所以这真的澄清了事情。再次感谢!
猜你喜欢
  • 2017-08-09
  • 1970-01-01
  • 2016-01-14
  • 2022-01-28
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多