web-dev-qa-db-ja.com

kotlinデータクラスに対するJackson @JsonPropertyアノテーションの使用

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)
27
Mike

@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?
)
41
SimY4

メソッドsetPropertyNamingStrategy(...)を呼び出すことにより、jacksonライブラリからObjectMapperを構成できます。

PropertyNamingStrategy.SNAKE_CASEを使用すると問題が解決するはずです

ここで利用可能な他の戦略も参照してください: PropertyNamingStrategy

3
Prim

次のようなことができます:

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

jackson-module-kotlinhttps://github.com/FasterXML/jackson-module-kotlin )を追加して、kotlinモジュールをjacksonに登録できます。

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

その後、それ(および他の多くのもの)は自動的に動作します。

0
GameScripting