web-dev-qa-db-ja.com

欠測値に対してJacksonにKotlinのデフォルトパラメータをどのように使用させるのですか?

私はこのようなKotlinデータクラスを持っています、

data class SomeData(
   private val notInJson: String = "some default value",
   private val inJson: String
)

そしてjson文字列、私はこのクラスのインスタンスに逆シリアル化したいです-

{
    "inJson" : "value"
}

このデータを逆シリアル化しようとすると、パラメーターnotInJsonをnullにできないというエラーが発生します。 json文字列にないため、Jacksonがnull値を渡しているようです。

クラス定義で指定されたデフォルトを使用できるように、Jacksonに値を渡さないようにする方法はありますか?

-編集-

KotlinModule()をマッパーに登録します。バージョン2.7.8または関連するすべてのjacksonパッケージを使用します。

次のコード-

@Test fun jackson_kotlin_module() {
    val mapper = ObjectMapper().registerModule(KotlinModule())
    println(
        mapper.readValue("""{ "inJson" : "some value" }""",     SomeData::class.Java))
}

私に与える-

com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple 
type, class SomeData] value failed (Java.lang.IllegalArgumentException): 
Parameter specified as non-null is null: method SomeData.<init>, parameter 
notInJson
at [Source: { "inJson" : "some value" }; line: 1, column: 27]
14
0cd

デフォルトのparamsはKotlinの機能です。ジャクソンはそれについて知らないので、それをサポートできるようにするために何らかの方法でそれを通知する必要があります。ありがたいことに、優れた jackson-kotlin-module があります。

val mapper: ObjectMapper = ObjectMapper()
        .registerModule(KotlinModule()) //let Jackson know about Kotlin
...
data class SomeData(
    private val notInJson: String = "some default value",
    private val inJson: String
)
...
val data = mapper.readValue<SomeData>("""{"inJson": "sample value"}""")
println(data) // -> SomeData(notInJson=some default value, inJson=sample value)

使用方法については、 jackson-kotlin-module Readme およびモジュールのバージョンに特に注意してください。とジャクソン自体。デフォルトのパラメータが機能するためには、 少なくともバージョン2.8.4 of jackson-kotlin-module

16
miensol