4

我有一些看起来像这样的 JSON:

{
    "name" : "Credit Card",
    "code" : "AUD",
    "value" : 1000
}

并使用 Moshi 将其解组为如下数据结构:

data class Account(
    @Json(name = "name")
    val name: String,

    @Json(name = "currency")
    val currency: String,

    @Json(name = "value")
    val value: Int
)

一切正常。但是,我真的很想将currencyandvalue参数提取到一个单独的Money对象中。所以我的模型看起来更像:

data class Money(
    @Json(name = "currency")
    val currency: String,

    @Json(name = "value")
    val value: Int
)

data class Account(
    @Json(name = "name")
    val name: String,

    @Json(name = "???")
    val money: Money
)

我正在努力解决的挑战是如何注释事物,以便可以为Money对象提供两个不同的字段 (currencyvalue),它们来自与父帐户相同的级别。

我是否需要创建一个名为的中间“解组”对象,MoshiAccount然后使用自定义适配器将其转换为我的真实Account对象?

我看到了如何使用 Moshi 将 int 数组反序列化为自定义类?看起来很接近(除了在这种情况下,适应的对象(VideoSize)只需要一个字段作为输入......在我的情况下,我需要currencyvalue

任何想法或建议将不胜感激。谢谢

4

1 回答 1

5

Moshi 的适配器可以为您改变 JSON 结构。

object ADAPTER {
  private class FlatAccount(
      val name: String,
      val currency: String,
      val value: Int
  )

  @FromJson private fun fromJson(json: FlatAccount): Account {
    return Account(json.name, Money(json.currency, json.value))
  }

  @ToJson private fun toJson(account: Account): FlatAccount {
    return FlatAccount(account.name, account.money.currency, account.money.value)
  }
}

不要忘记将适配器添加到您的 Moshi 实例中。

val moshi = Moshi.Builder().add(Account.ADAPTER).add(KotlinJsonAdapterFactory()).build()
val adapter = moshi.adapter(Account::class.java)
于 2017-10-03T18:42:42.123 回答