2016-10-28 19 views
5

我有一個科特林數據類,看起來像這樣,你如何讓傑克遜使用Kotlin默認參數的缺失值?

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

和JSON字符串,我想反序列化到這個類的一個實例 -

{ 
    "inJson" : "value" 
} 

當我嘗試反序列化此數據,我得到一個錯誤,參數notInJson不能爲空。似乎傑克遜正在傳遞一個空值,因爲它在json字符串中缺失。

有沒有辦法讓傑克遜沒有爲它傳遞任何值,以便可以使用類定義中指定的默認值?

- 編輯 -

我做的映射器註冊KotlinModule()。使用2.7.8版本或涉及所有傑克遜軟件包。

下面的代碼 -

@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] 
+1

@miensol說,你需要升級到最新的傑克遜(2.8.4或更高版本),因爲處理默認參數的能力已被添加,並且尚未被回溯。 –

回答

6

默認params爲一個科特林功能。傑克遜不知道它,因此我們需要以某種方式告知它能夠支持它。值得慶幸的是有優秀的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特別注意模塊和傑克遜本身的版本。爲了使默認參數起作用,你需要at least version 2.8.4jackson-kotlin-module

+0

對不起,我應該提到我已經在使用KotlinModule()。編輯我的問題來反映這一點。 – 0cd

+0

@PuneetArora你需要注意版本。 jackson-kotlin-module 2.8.4支持構造函數和創建者方法的默認參數。 – miensol