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}}
ご覧のとおり、最後の2つのオプションは誤って逆シリアル化されました。この問題は、ゲッター@get:JsonPropertyに直接注釈を追加することで解決できます。ただし、jacksonのドキュメントによると、@ JsonPropertyはgetter/setter/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)
@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?
)
メソッドsetPropertyNamingStrategy(...)
を呼び出すことにより、jacksonライブラリからObjectMapperを構成できます。
PropertyNamingStrategy.SNAKE_CASE
を使用すると問題が解決するはずです
ここで利用可能な他の戦略も参照してください: PropertyNamingStrategy
次のようなことができます:
data class CurrencyInfo @JsonCreator constructor (
@param:JsonProperty("currency_info")
@get:JsonProperty("currency_info")
val currencyInfo: CurrencyInfoItem?
)
jackson-module-kotlin
( https://github.com/FasterXML/jackson-module-kotlin )を追加して、kotlinモジュールをjacksonに登録できます。
val mapper = ObjectMapper().registerModule(KotlinModule())
その後、それ(および他の多くのもの)は自動的に動作します。