java - 对 kotlin 数据类使用 Jackson @JsonProperty 注释

Kotlin 1.2.10 jackson-module-kotlin:2.9.0

我在 kotlin 中有以下数据类:

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 文档,@JsonProperty 应该分配给 getters/setters/fields

所以,我想问有没有一种可靠的方法来注释 kotlin 中的 jackson 属性以进行正确的序列化/反序列化(此外,我所有的数据类都是自动生成的,因此很难创建一些两/三行注释,分别用于 getter 和 setter)

否则,这个问题可以通过一些 jackson 设置来解决吗?

根据下面的答案,以下对我有用

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 代码中的注释都放在数据类中的私有(private)字段上,默认情况下,Jackson 不会扫描私有(private)字段以查找注释。您必须通过放置 @JsonAutoDetect 注释来指示它执行其他操作:

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

或者您可以在访问器方法上移动您的注释:

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

https://stackoverflow.com/questions/47982148/

相关文章:

javascript - 通过 JSON 发送 64 位值的公认方式是什么?

python - 将 JSON 模式转换为 python 类

java - 将 Gson 与接口(interface)类型一起使用

json - 在 Ubuntu 上将 jq 升级到 1.5

javascript - DRYing JSON 有什么众所周知的方法吗

javascript - 通过 Angular 资源服务读取 JSON

c# - 如何从 JObject 中按键获取值?

json - 处理 HTTP 请求正文中的可选 JSON 字段

json - Swift 4 JSON Decodable 解码类型更改的最简单方法

javascript - 什么是 Node JS 的最佳 JSON 或 JS 对象到 XML 转换器