Rob Elliot
10/24/2022, 10:28 AM@JsonValue
work when the property is nullable and the json has null as the value?Rob Elliot
10/24/2022, 10:29 AMimport com.fasterxml.jackson.annotation.JsonValue
import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.module.kotlin.kotlinModule
import org.intellij.lang.annotations.Language
data class Wrapper(val value: String, val inlined: Inlined)
data class Inlined(@get:JsonValue val inlined: Int?)
val objectMapper: JsonMapper = JsonMapper.builder()
.addModule(kotlinModule())
.build()
fun main() {
checkSerializeDeserialize(Wrapper("whatever", Inlined(1))) // works
checkSerializeDeserialize(Wrapper("whatever", Inlined(null))) // fails
}
private fun checkSerializeDeserialize(original: Wrapper) {
val json = objectMapper.writeValueAsString(original)
assert(json == """{"value":"whatever","inlined":${original.inlined.inlined}}""")
val remade = objectMapper.readValue(json, Wrapper::class.java)
assert(remade == original)
}
Rob Elliot
10/24/2022, 10:32 AM"inlined":1
, but while it will serialise "inlined":null
correctly, it fails on deserialisation:
Exception in thread "main" com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class pages.Wrapper] value failed for JSON property inlined due to missing (therefore NULL) value for creator parameter inlined which is a non-nullable type
at [Source: (String)"{"value":"whatever","inlined":null}"; line: 1, column: 35] (through reference chain: pages.Wrapper["inlined"])
Rob Elliot
10/24/2022, 10:59 AMWrapper
.Rob Elliot
10/24/2022, 11:28 AMRob Elliot
10/24/2022, 11:42 AMdata class Wrapper(val value: String, val inlined: Inlined) {
@JsonCreator
private constructor(
@JsonProperty("value") value: String,
@JsonProperty("inlined") inlined: Int?,
): this(value, Inlined(inlined))
}