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

时间:2017-12-26 18:08:29

标签: java json jackson kotlin deserialization

kotlin 1.2.10 杰克逊模块-科特林: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 docs @JsonProperty应该分配给getters / setters / fields

所以,我想问一下,是否有一种可靠的方法来为kotlin中的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)

7 个答案:

答案 0 :(得分:31)

代码中的

@JsonProperty注释全部放在数据类的私有字段中。默认情况下,杰克逊不会扫描私有字段以进行注释。您必须通过JsonAutoDetect注释:

来指示它做其他事情
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
data class CurrencyInfo(
    @JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem?
)

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

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

答案 1 :(得分:3)

您可以通过调用方法setPropertyNamingStrategy(...)

从jackson库配置ObjectMapper

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

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

答案 2 :(得分:1)

Kotlin不支持将@param和@get注释作为一个注释,因此我们必须编写以下代码:

data class User(
    @param:JsonProperty("id") @get:JsonProperty("id") val id: Int,
    @param:JsonProperty("name") @get:JsonProperty("name") val name: String
)

在这里您可以告诉JetBrain家伙支持此功能并允许:

data class User(
    @JsonProperty("id") val id: Int,
    @JsonProperty("name") val name: String
)

https://youtrack.jetbrains.com/issue/KT-11005

答案 3 :(得分:0)

您可以添加jackson-module-kotlinhttps://github.com/FasterXML/jackson-module-kotlin)并向jackson注册kotlin模块:

val mapper = ObjectMapper().registerModule(KotlinModule())

然后它(以及许多其他东西)自动运行。

答案 4 :(得分:0)

您可以执行以下操作:

data class CurrencyInfo @JsonCreator constructor (
        @param:JsonProperty("currency_info") 
        @get:JsonProperty("currency_info")
        val currencyInfo: CurrencyInfoItem?
)

答案 5 :(得分:0)

我今天遇到了这个问题,我要做的就是在我的ObjectMapper()中注册KotlinModule()。波纹管就是一个例子。

@Bean fun objectMapper = ObjectMapper().registreModule(KotlinModule())

上面是一个虚拟的objectMapper,我相信您应该将其他配置(例如序列化程序等)放入您的objectMapper中

答案 6 :(得分:0)

此问题已解决

std::cin >> c;

或者你也可以使用

    https://github.com/FasterXML/jackson-module-kotlin/issues/237