预期 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<List<String>>
或者使用自定义序列化程序。
【参考方案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