Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 使用具有多个输入字段的Moshi_Kotlin_Moshi - Fatal编程技术网

Kotlin 使用具有多个输入字段的Moshi

Kotlin 使用具有多个输入字段的Moshi,kotlin,moshi,Kotlin,Moshi,我有一些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 =

我有一些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
)
一切正常。但是,我确实希望将
currency
value
参数提取到一个单独的
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
对象可以被赋予两个不同的字段(
currency
value
),它们与父帐户来自同一级别

我是否需要创建一个中间的“解组”对象,比如说,
MoshiAccount
,然后使用自定义适配器将其转换为我真正的
帐户
对象

我看到哪个看起来很接近(除了在这种情况下,调整的对象(VideoSize)只需要一个字段作为输入…在我的情况下,我需要
货币


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

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)

感谢您的确认。本质上,我需要创建一个中间的解组对象,然后将其转换为我的真实对象。虽然这对单个实例(例如Account)非常有效,但它也意味着我需要为包含Money对象的每个类型创建一个解组克隆。这么多样板文件:-(尽管很感谢答案…@CraigEdwards JsonAdapter。工厂才是真正的力量所在。你也许可以用它来制定一个更通用的解决方案。