当前位置: 首页 > 面试题库 >

Jackson @JsonProperty批注在Kotlin数据类中的用法

储志业
2023-03-14
问题内容

kotlin 1.2.10杰克逊模块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,可以解决此问题。但是,根据杰克逊文档,@
JsonProperty应该分配给getters / setters / fields

因此,我想问问有没有一种可靠的方法来为kotlin中的jackson注释属性以具有正确的序列化/反序列化(而且我的所有数据类都是自动生成的,因此很难分别为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代码中的注释都放在数据类的私有字段中,默认情况下,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?
)


 类似资料:
  • kotlin 1.2.10 Jackson-Module-kotlin:2.9.0 根据下面的答案,下面的工作对我来说

  • 我使用Jackson(2.1.1)进行JSON序列化/反序列化。我有一个带有JAXB注释的现有类。大多数注释都是正确的,可以像jackson一样使用。我使用mix-ins稍微改变这些类的反序列化/序列化。 在我的ObjectMapper构造函数中,我执行以下操作: 基于上述情况,由于内省者的顺序,Jackson注释优先于Jaxb。这是基于Jackson Jaxb文档的。对于我希望忽略的字段,将添加

  • 当使用Spring的RestTemplate将一些JSON响应反序列化为对象时,我没有这样做,因为我使用了Kotlin数据类作为对象模型。 这是数据类: 我使用这些依赖项: 执行涉及RestTemboard逻辑的单元测试时的错误消息: 原因:com.fasterxml.jackson.databind.exc.无效定义异常:无法构造的实例(没有Creator,如默认构造,存在):无法从Object

  • 本文向大家介绍何时在Java的Jackson中使用@ConstructorProperties批注?,包括了何时在Java的Jackson中使用@ConstructorProperties批注?的使用技巧和注意事项,需要的朋友参考一下 @ConstructorProperties注释是从java.bean小号包装,用于通过反序列化JSON到Java对象 注释构造。此注释从Jackson 2.7版本

  • 我知道如何在普通Kotlin类上使用apply函数,但无法将其用于数据类: 我得到一个编译消息: 没有为参数“name”传递值

  • 问题内容: 在Java中,我可以“实现”注释。 示例Java注释: 示例Java“实现”: 尝试将其移植到Kotlin无效,因为它说注释是最终的,因此不能被继承,即以下内容将不起作用: 您如何以Kotlin方式“实现/扩展”注释?找不到Kotlin在Java方面有所不同的任何原因。欢迎提供任何有关如何解决该问题的提示,也欢迎任何告诉您原因的信息。 以下问题包含此星座的用例:动态激发CDI事件,其成