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

Котлин 1.2.10 Джексон-модуль-Котлин: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. Однако, согласно jackson docs @JsonProperty должен быть назначен геттеры/сеттеры/поля

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

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

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

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)

2 ответов


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

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

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

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

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

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

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