diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index cb7f3b7bd..0c0fb820c 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -21,6 +21,7 @@ kkurczewski * #689: Add KotlinDuration support WrongWrong (@k163377) +* #707: Changed to use default argument on null if JsonSetter(nulls = Nulls.SKIP) is specified. * #700: Reduce the load on the search process for serializers * #687: Optimize and Refactor KotlinValueInstantiator.createFromObjectWith * #686: Add KotlinPropertyNameAsImplicitName option diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 7d39d3d76..1acd8065e 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -18,6 +18,7 @@ Co-maintainers: 2.16.0 (not yet released) +#707: If JsonSetter(nulls = Nulls.SKIP) is specified, the default argument is now used when null. #700: Reduce the load on the search process for serializers. #689: Added UseJavaDurationConversion feature. By enabling this feature and adding the Java Time module, Kotlin Duration can be handled in the same way as Java Duration. diff --git a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt index 47f3683c1..aebdd2f14 100644 --- a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt +++ b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt @@ -1,5 +1,6 @@ package com.fasterxml.jackson.module.kotlin +import com.fasterxml.jackson.annotation.Nulls import com.fasterxml.jackson.databind.BeanDescription import com.fasterxml.jackson.databind.DeserializationConfig import com.fasterxml.jackson.databind.DeserializationContext @@ -32,6 +33,9 @@ internal class KotlinValueInstantiator( private fun List.markedNonNullAt(index: Int) = getOrNull(index)?.type?.isMarkedNullable == false + private fun SettableBeanProperty.skipNulls(): Boolean = + nullIsSameAsDefault || (metadata.valueNulls == Nulls.SKIP) + override fun createFromObjectWith( ctxt: DeserializationContext, props: Array, @@ -70,7 +74,7 @@ internal class KotlinValueInstantiator( val paramType = paramDef.type var paramVal = if (!isMissing || paramDef.isPrimitive() || jsonProp.hasInjectableValueId()) { val tempParamVal = buffer.getParameter(jsonProp) - if (nullIsSameAsDefault && tempParamVal == null && paramDef.isOptional) { + if (tempParamVal == null && jsonProp.skipNulls() && paramDef.isOptional) { return@forEachIndexed } tempParamVal diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/github/Github526.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/github/Github526.kt new file mode 100644 index 000000000..1ef7eac27 --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/github/Github526.kt @@ -0,0 +1,20 @@ +package com.fasterxml.jackson.module.kotlin.test.github + +import com.fasterxml.jackson.annotation.JsonSetter +import com.fasterxml.jackson.annotation.Nulls +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import org.junit.Test +import kotlin.test.assertEquals + +class Github526 { + data class D(@JsonSetter(nulls = Nulls.SKIP) val v: Int = -1) + + @Test + fun test() { + val mapper = jacksonObjectMapper() + val d = mapper.readValue("""{"v":null}""") + + assertEquals(-1, d.v) + } +}