Использование аннотации Jackson @JsonProperty для классов данных kotlin

kotlin 1.2.10 jackson-module-kotlin: 2.9.0

У меня есть следующий класс данных в котлине:

data class CurrencyInfo( @JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem? ) @JsonInclude(JsonInclude.Include.NON_NULL) data class CurrencyInfoItem( @JsonProperty("iso_4217") var iso4217: String?, @JsonProperty("name") var name: String?, @JsonProperty("name_major") var nameMajor: String?, @JsonProperty("name_minor") var nameMinor: String?, @JsonProperty("i_ma_currency") var iMaCurrency: Int?, @JsonProperty("i_merchant_account") var iMerchantAccount: Int?, @JsonProperty("i_x_rate_source") var iXRateSource: Int?, @JsonProperty("base_units") var baseUnits: Double?, @JsonProperty("min_allowed_payment") var minAllowedPayment: Int?, @JsonProperty("decimal_digits") var decimalDigits: Int?, @JsonProperty("is_used") var isUsed: Boolean? ) 

Когда я пытаюсь десериализовать этот класс данных, я получаю следующее:

 {"currency_info":{"iso_4217":"CAD","name":"Canadian Dollar","imerchantAccount":0,"ixrateSource":2}} 

Как вы можете видеть, последние два параметра были десериализованы неправильно. Эта проблема может быть решена путем добавления аннотации к getter @get: JsonProperty. Однако, согласно джексону, docs @JsonProperty следует назначить для getters / setters / fields

Итак, я хочу спросить, есть ли надежный способ аннотировать свойство для jackson в kotlin, чтобы иметь правильную сериализацию / десериализацию (более того, все мои классы данных автогенерируются, поэтому было бы сложно создать несколько аннотаций из двух / трех строк, отдельно для getter и сеттер)

В противном случае, можно ли решить эту проблему с помощью некоторых настроек джексона?

Согласно нижеприведенным ответам, для меня работают следующие работы

 private val mapper = ObjectMapper().registerKotlinModule() .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY) .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE) 

Аннотации @JsonProperty в вашем коде все помещаются в частные поля в вашем классе данных. И по умолчанию Джексон не сканирует частные поля для аннотаций. Вы должны JsonAutodetect его сделать иначе, JsonAutodetect аннотацию JsonAutodetect :

 @JsonAutodetect(fieldVisibility = Visibility.PRIVATE) data class CurrencyInfo( @JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem? ) 

или, альтернативно, вы можете перенести свои аннотации на методы доступа:

 data class CurrencyInfo( @get:JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem? ) 

Вы можете настроить ObjectMapper из библиотеки jackson, вызвав метод setPropertyNamingStrategy(...)

Использование PropertyNamingStrategy.SNAKE_CASE должно решить вашу проблему

См. Также другие доступные стратегии здесь: PropertyNamingStrategy

Intereting Posts
RecyclerView.Adapter- Ошибка: публичные функции раскрывают свой внутренний тип возврата в Котлине Референциальное и структурное равенство в Котлине Классы класса Kotlin, которые наследуют классы Java, также наследуются от Any? Истребитель Котлин перечислить? Недостаток равенства Котлина Котлин заставляет геттер / сеттер рефлексивно Не удалось загрузить файл на Android, и нет никаких сведений об ошибке Ошибка: не удалось найти или загрузить основной класс Hello.class Класс данных Kotlin, реализующий интерфейс Java Проблемы с Kotlin с привязкой данных Android Kotlin: "val someVar = if (xx) 1 else 1.0", почему someVar является "Any"? Функция Pass, которая получает параметры как параметр для расширения класса Почему использование аннотаций Scopes и Singleton в Dagger2 с kotlin вызывает ошибку при компиляции? Многие небольшие модули или несколько больших модулей для лучшей производительности? Android Kotlin – Невозможно планировать уведомление для будущей даты с помощью диспетчера аварийных сигналов