Использование 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 = "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 ), которые поступают с того же уровня, что и родительская учетная запись.

Нужно ли мне создавать промежуточный объект «unmarshalling», называемый, например, MoshiAccount а затем использовать пользовательский адаптер для преобразования этого объекта в мой реальный объект?

Я видел, как десарализовать массив int в пользовательский класс с Moshi? который выглядит близко (за исключением того, что в этом случае адаптированному объекту (VideoSize) требуется только одно поле для ввода … в моем случае мне нужны как currency и value )

Любые мысли или предложения будут высоко оценены. благодаря

Адаптеры 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)