From 863d3accb77d2bd8ca5486e2a14a45689df22c33 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 26 Aug 2023 04:08:59 +0900 Subject: [PATCH 1/5] Fixed to use default value if JsonSetter(nulls = Nulls.SKIP) is specified Fixes #526 --- .../jackson/module/kotlin/KotlinValueInstantiator.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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..0e1acfebc 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,7 @@ package com.fasterxml.jackson.module.kotlin +import com.fasterxml.jackson.annotation.JsonSetter +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 +34,9 @@ internal class KotlinValueInstantiator( private fun List.markedNonNullAt(index: Int) = getOrNull(index)?.type?.isMarkedNullable == false + private fun SettableBeanProperty.skipNulls(): Boolean = + nullIsSameAsDefault || (getAnnotation(JsonSetter::class.java).nulls == Nulls.SKIP) + override fun createFromObjectWith( ctxt: DeserializationContext, props: Array, @@ -70,7 +75,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 From f04e2f4ce83abd85f1c15d70c39b30e7b25a3e17 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 26 Aug 2023 04:27:17 +0900 Subject: [PATCH 2/5] Add test --- .../module/kotlin/test/github/Github526.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/github/Github526.kt 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) + } +} From 23050b18de4f8e1bb216357e794be685bccbb6e4 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 26 Aug 2023 04:45:58 +0900 Subject: [PATCH 3/5] Fix null handling --- .../fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0e1acfebc..566425e5b 100644 --- a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt +++ b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt @@ -35,7 +35,7 @@ internal class KotlinValueInstantiator( private fun List.markedNonNullAt(index: Int) = getOrNull(index)?.type?.isMarkedNullable == false private fun SettableBeanProperty.skipNulls(): Boolean = - nullIsSameAsDefault || (getAnnotation(JsonSetter::class.java).nulls == Nulls.SKIP) + nullIsSameAsDefault || (getAnnotation(JsonSetter::class.java)?.nulls == Nulls.SKIP) override fun createFromObjectWith( ctxt: DeserializationContext, From 11350bca5ca03371e20c0e7c556ed3a63b8540ce Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 26 Aug 2023 12:45:55 +0900 Subject: [PATCH 4/5] Modified the acquisition method to take into account custom annotation processing. --- .../fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 566425e5b..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,6 +1,5 @@ package com.fasterxml.jackson.module.kotlin -import com.fasterxml.jackson.annotation.JsonSetter import com.fasterxml.jackson.annotation.Nulls import com.fasterxml.jackson.databind.BeanDescription import com.fasterxml.jackson.databind.DeserializationConfig @@ -35,7 +34,7 @@ internal class KotlinValueInstantiator( private fun List.markedNonNullAt(index: Int) = getOrNull(index)?.type?.isMarkedNullable == false private fun SettableBeanProperty.skipNulls(): Boolean = - nullIsSameAsDefault || (getAnnotation(JsonSetter::class.java)?.nulls == Nulls.SKIP) + nullIsSameAsDefault || (metadata.valueNulls == Nulls.SKIP) override fun createFromObjectWith( ctxt: DeserializationContext, From 0466751ae7c00f93f27d87683f3b55541a8e5d4e Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Fri, 1 Sep 2023 22:57:12 +0900 Subject: [PATCH 5/5] Update release notes wrt #707 --- release-notes/CREDITS-2.x | 1 + release-notes/VERSION-2.x | 1 + 2 files changed, 2 insertions(+) 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.