Jackson @JsonProperty注释用于kotlin数据类的使用

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 /领域

所以,我想问是否有一个可靠的方法来注释jackot的属性在kotlin有正确的序列化/反序列化(此外我所有的数据类都是自动生成的,所以很难创建一些两/三行注释,分别为getter和二传手)

否则,这个问题可以解决一些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注释全部放在数据类的私有字段中。 jackson默认情况下不会扫描私人字段的注释。 你必须通过放入JsonAutodetect注释来指示它做什么:

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

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

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

您可以通过调用setPropertyNamingStrategy(...)方法从jackson库配置ObjectMapper,

使用PropertyNamingStrategy.SNAKE_CASE应该可以解决您的问题

另请参阅其他可用策略: PropertyNamingStrategy