【问题标题】:Kotlin Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $Kotlin 预期 BEGIN_OBJECT 但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY
【发布时间】:2020-09-22 21:04:32
【问题描述】:

您好,我对改造和 api 有疑问。我从此使用了api: https://api.thecatapi.com/v1/breeds我添加了我的授权密钥

这是我的带有插件 kotlin 数据类的模型:

data class CatsItem(
    @SerializedName("adaptability")
    val adaptability: Int,
    @SerializedName("affection_level")
    val affectionLevel: Int,
    @SerializedName("alt_names")
    val altNames: String,
    @SerializedName("bidability")
    val bidability: Int,
    @SerializedName("cat_friendly")
    val catFriendly: Int,
    @SerializedName("cfa_url")
    val cfaUrl: String,
    @SerializedName("child_friendly")
    val childFriendly: Int,
    @SerializedName("country_code")
    val countryCode: String,
    @SerializedName("country_codes")
    val countryCodes: String,
    @SerializedName("description")
    val description: String,
    @SerializedName("dog_friendly")
    val dogFriendly: Int,
    @SerializedName("energy_level")
    val energyLevel: Int,
    @SerializedName("experimental")
    val experimental: Int,
    @SerializedName("grooming")
    val grooming: Int,
    @SerializedName("hairless")
    val hairless: Int,
    @SerializedName("health_issues")
    val healthIssues: Int,
    @SerializedName("hypoallergenic")
    val hypoallergenic: Int,
    @SerializedName("id")
    val id: String,
    @SerializedName("indoor")
    val indoor: Int,
    @SerializedName("intelligence")
    val intelligence: Int,
    @SerializedName("lap")
    val lap: Int,
    @SerializedName("life_span")
    val lifeSpan: String,
    @SerializedName("name")
    val name: String,
    @SerializedName("natural")
    val natural: Int,
    @SerializedName("origin")
    val origin: String,
    @SerializedName("rare")
    val rare: Int,
    @SerializedName("rex")
    val rex: Int,
    @SerializedName("shedding_level")
    val sheddingLevel: Int,
    @SerializedName("short_legs")
    val shortLegs: Int,
    @SerializedName("social_needs")
    val socialNeeds: Int,
    @SerializedName("stranger_friendly")
    val strangerFriendly: Int,
    @SerializedName("suppressed_tail")
    val suppressedTail: Int,
    @SerializedName("temperament")
    val temperament: String,
    @SerializedName("vcahospitals_url")
    val vcahospitalsUrl: String,
    @SerializedName("vetstreet_url")
    val vetstreetUrl: String,
    @SerializedName("vocalisation")
    val vocalisation: Int,
    @SerializedName("weight")
    val weight: Weight,
    @SerializedName("wikipedia_url")
    val wikipediaUrl: String
)

这是我的回应:

>  viewModel.myResponse.observe(this, Observer { response ->
            if (response.isSuccessful) {
                Log.d("Response", response.body()?.id.toString())
               massage.text = response.body()?.name.toString()
                

            } else {
                Log.d("Response", response.errorBody().toString())
                errormassage.text = response.code().toString()
            }
        })

我想在 textView 中显示品种名称,但我在运行应用程序时出错:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 应为 BEGIN_OBJECT 但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY

我做错了什么?

感谢任何提示和帮助

【问题讨论】:

    标签: kotlin gson retrofit


    【解决方案1】:

    从您指定的 URL 生成的 JSON 返回一个对象数组。如果整个响应是成功案例中response.body() 中的内容,那么您的代码无法正确处理该响应。假设返回的结构由单个对象而不是对象数组组成。

    换句话说,返回的结果是这样的:

    [
        {
            "key1": "value1",
            "key2": 1234
        }
    ]
    

    但您的代码是预期的:

    {
        "key1": "value1",
        "key2": 1234
    }
    

    如果你不确定,为什么不打印出response.body() 的值来看看里面有什么?

    如果是这样的话,修复应该是这样的:

    response.body()?.get(0).name.toString()
    

    对数组中的第一项进行操作。 (或类似的东西。我在 Kotlin 与 Java 方面做得很少,所以可能还有另一个 ? 或其他东西。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-29
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2020-09-26
      • 2020-01-06
      • 1970-01-01
      相关资源
      最近更新 更多