私はこのような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]
デフォルトの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