【问题标题】:How can I deserialize this?我怎样才能反序列化这个?
【发布时间】:2019-09-23 07:21:22
【问题描述】:

我有一个 API REST 调用的 JSON 响应,我不太确定应该如何反序列化...

{
.....
"date": "10-10-19", 
"rates": {
    "GBP" : 101.01,
    "EUR" : 102.01,
    "AUD" : 103.4,
    ......
    }
}

我想知道如何反序列化“rates”对象?我认为这是一个 Map 对象,所以使用 Gson 我制作了下一个 POJO:

class POJO(
private val base: String,
private val date: Date,
private val rates: Rate
)

我的 Rate 等级是

class Rate ( private val currency : Map <String, Double> )

除非我尝试在课堂上使用此地图,否则不会有任何问题。例如,当我尝试访问此变量时:

view?.converterBinder!!.setCurrencyList(it.data!!.rates.currency)

currency 为空,因为我认为 Gson 不知道如何解决它。我不知道我是否必须手动反序列化它或者使用 Gson 有任何解决方案。

有什么想法吗??

【问题讨论】:

  • 响应本身不合适。它是有效的,但结构非常糟糕。为了便于解析,它应该是一个货币数组,而不是一个对象。您可以创建自己的自定义反序列化器,它将遍历 rates 的键并存储值。
  • 我知道@VladyslavMatviienko 这是一个非常奇怪的响应,但我无法修改它:( 所以我想我需要像你说的那样手动反序列化。
  • 我仅次于@VladyslavMatviienko 评论,您的 JSON 在语法上是正确的,但在概念上是错误的。但尽管您可以使用以下方式向 Map 添加自定义:baeldung.com/gson-json-to-map

标签: android json kotlin serialization gson


【解决方案1】:

提供的Json完全错误,应该这样格式化

{
    "date": "10-10-19",
    "rates": {
        "GBP": 101.01,
        "EUR": 102.01
    }
}

请与https://jsonlint.com 确认Json 的有效性。

所以你有一个带有字符串“date”的 json 对象,然后你有另一个名为“rates”的 json 对象,其中包含 2 个数字双精度“GBP”和“EUR”。

每个 Json 都应该由一个类表示,因此要对其进行解析,请创建以下包含 2 个类的对象

object Models {

    data class Rates(@SerializedName("GBP") val gbp: Double,
                     @SerializedName("EUR") val eur: Double)

    data class ExchangeRates(@SerializedName("date") val date: String,
                             @SerializedName("rates") val rates: Rates)
}

现在您将 ExchangeRates 类传递给 Gson 以反序列化您的对象,您应该拥有所有数据。

【讨论】:

  • 很难注意到您的 更正 JSON 中有什么不同。请列出那里有什么问题
  • @VladyslavMatviienko 它有正确的双引号冒号
  • @kazikal 我认为您在 List 方面仍然是错误的,因为您在 POJO 本身中定义了所有货币评级。怎么可能是列表?
  • 请在答案中列出
  • @BipinVayalu 是的,我注意到在发布答案后不久就犯了错误。已经更正了
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 2020-06-08
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 2019-11-10
相关资源
最近更新 更多