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)
答案 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(...)
使用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
)
答案 3 :(得分:0)
您可以添加jackson-module-kotlin
(https://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