【问题标题】:Using Moshi with multiple input fields使用具有多个输入字段的 Moshi
【发布时间】:2018-03-10 20:55:51
【问题描述】:

我有一些如下所示的 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
)

一切正常。但是,我真的很想将currencyvalue 参数提取到单独的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 对象?

我看到How to deseralize an int array into a custom class with Moshi? 看起来很接近(除了在这种情况下,适配对象(VideoSize)只需要一个字段作为输入......在我的情况下,我需要currencyvalue

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

【问题讨论】:

    标签: kotlin moshi


    【解决方案1】:

    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)
    

    【讨论】:

    • 感谢您的确认。基本上,我需要创建一个中间解组对象,然后将其转换为我的真实对象。虽然这对于单个实例(例如帐户)非常有效,但是,这也意味着我需要为包含 Money 对象的 每个 类型创建一个解组克隆。这么多样板:-(虽然欣赏答案...
    • @CraigEdwards JsonAdapter.Factory 是真正的力量所在。你也许可以用它做出更通用的解决方案。
    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多