预期 BEGIN_OBJECT 但在 Kotlin 中使用 Gson 是 BEGIN_ARRAY”

Posted

技术标签:

【中文标题】预期 BEGIN_OBJECT 但在 Kotlin 中使用 Gson 是 BEGIN_ARRAY”【英文标题】:Expected BEGIN_OBJECT but was BEGIN_ARRAY" using Gson in Kotlin 【发布时间】:2021-12-11 07:42:01 【问题描述】:

我正在尝试从 api 检索数据。 JSON 响应如下所示



    "result":"success",
    "documentation":"https://www.exchangerate-api.com/docs",
    "terms_of_use":"https://www.exchangerate-api.com/terms"
    "supported_codes":[
        ["AED","UAE Dirham"],
        ["AFN","Afghan Afghani"],
        ["ALL","Albanian Lek"],
        ["AMD","Armenian Dram"],
        ["ANG","Netherlands Antillian Guilder"],
        ["AOA","Angolan Kwanza"],
        ["ARS","Argentine Peso"],
        ["AUD","Australian Dollar"],
        ["AWG","Aruban Florin"],
        ["AZN","Azerbaijani Manat"],
        ["BAM","Bosnia and Herzegovina Convertible Mark"],
        ["BBD","Barbados Dollar"] etc. etc.
    ]


这是我为它准备的数据类。

CurrencyResponse.kt


package com.example.currencyconverter.data

import com.squareup.moshi.Json

data class CurrencyResponse(
    @Json(name="supported_codes") var supported_codes: List<Codes>
) 
    data class Codes(
        @Json(name="0") var currency_code: String
    ) 

    



但我仍然收到标题中提到的错误。非常感谢任何帮助

【问题讨论】:

我对 Gson 不是很熟悉,但是将数组(例如 ["AED","UAE Dirham"])反序列化为 Codes 对象似乎不太对。您可能需要这样的东西:var supported_codes: List&lt;List&lt;String&gt;&gt; 或者使用自定义序列化程序。 【参考方案1】:

如果可能,我认为 API 响应方案需要稍作修改。我认为supported_codes 应该包含对象列表,即

    "supported_codes":[
        
             "currency_code": "AED",
             "currency_name": "UAE Dirham"
        ,
        
             "currency_code": "AFN",
             "currency_name": "Afghan Afghani"
        ,
        ... etc ...
    ]

然后,在您的 kotlin 代码中,您需要将 Codes 数据类修改为:

data class Codes(
   @Json(name="currency_code") val currencyCode: String,
   @Json(name="currency_name") val currencyName: String,
)

【讨论】:

但是事情是这样的,数组条目没有名称,所以我可以写“currency_code”和“currency_name”作为名称吗? 不幸的是,它还需要更改 API 响应架构。但是,在我看来,将对象数组放入 supported_codes 可以帮助客户端轻松识别传递的属性,而不是数组数组 我把它改成了这个`数据类CurrencyResponse(@Json(name="supported_codes")val supportedCodes: List>)`应用程序不再崩溃但我得到一个空响应 或者,您可以尝试解析supportedCodes,如***.com/a/17974337中回答的那样

以上是关于预期 BEGIN_OBJECT 但在 Kotlin 中使用 Gson 是 BEGIN_ARRAY”的主要内容,如果未能解决你的问题,请参考以下文章

“预期为 BEGIN_OBJECT,但在第 1 行第 1 列为 STRING”

预期 BEGIN_OBJECT 但在第 1 行第 1 列路径为 STRING - Laravel 到改造 2

预期BEGIN_ARRAY但在第1行第2列是BEGIN_OBJECT

如何修复预期的字符串,但在带有改造的嵌套数组上是 BEGIN_OBJECT

获得错误预期BEGIN_ARRAY但在第1行第2列路径$是BEGIN_OBJECT

预期 BEGIN_ARRAY 但在第 1 行第 2 列是 BEGIN_OBJECT。如何解决?