Skip to content

Commit 36f84a2

Browse files
committed
Merge branch 'novtor/2.13' into 2.13
2 parents 8128f97 + 95e5b92 commit 36f84a2

File tree

9 files changed

+118
-8
lines changed

9 files changed

+118
-8
lines changed

release-notes/CREDITS-2.x

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ wrongwrong (k163377@github)
4242
* Contributed #438: Fixed mapping failure when `private` `companion object` is named
4343
(2.13)
4444

45+
Dmitri Domanine (novtor@github)
46+
* Contributed fix for #490: Missing value of type JsonNode? is deserialized as NullNode instead of null
47+
(2.13)
48+
4549
Marshall Pierce (marshallpierce@github)
4650
* #474: Reported disrespect for @JsonProperty on parent class
4751
(2.12.NEXT)

src/main/kotlin/com/fasterxml/jackson/module/kotlin/Extensions.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ package com.fasterxml.jackson.module.kotlin
33
import com.fasterxml.jackson.core.JsonParser
44
import com.fasterxml.jackson.core.TreeNode
55
import com.fasterxml.jackson.core.type.TypeReference
6-
import com.fasterxml.jackson.databind.*
6+
import com.fasterxml.jackson.databind.JsonDeserializer
7+
import com.fasterxml.jackson.databind.JsonMappingException
8+
import com.fasterxml.jackson.databind.JsonNode
9+
import com.fasterxml.jackson.databind.JsonSerializer
10+
import com.fasterxml.jackson.databind.MappingIterator
11+
import com.fasterxml.jackson.databind.ObjectMapper
12+
import com.fasterxml.jackson.databind.ObjectReader
713
import com.fasterxml.jackson.databind.json.JsonMapper
814
import com.fasterxml.jackson.databind.module.SimpleModule
915
import com.fasterxml.jackson.databind.node.ArrayNode

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinKeySerializers.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.fasterxml.jackson.module.kotlin
22

33
import com.fasterxml.jackson.core.JsonGenerator
4-
import com.fasterxml.jackson.databind.*
4+
import com.fasterxml.jackson.databind.BeanDescription
5+
import com.fasterxml.jackson.databind.JavaType
6+
import com.fasterxml.jackson.databind.JsonSerializer
7+
import com.fasterxml.jackson.databind.SerializationConfig
8+
import com.fasterxml.jackson.databind.SerializerProvider
59
import com.fasterxml.jackson.databind.ser.Serializers
610
import com.fasterxml.jackson.databind.ser.std.StdSerializer
711

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinModule.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.fasterxml.jackson.module.kotlin.KotlinFeature.NullToEmptyMap
88
import com.fasterxml.jackson.module.kotlin.KotlinFeature.StrictNullChecks
99
import com.fasterxml.jackson.module.kotlin.SingletonSupport.CANONICALIZE
1010
import com.fasterxml.jackson.module.kotlin.SingletonSupport.DISABLED
11-
import java.util.BitSet
11+
import java.util.*
1212
import kotlin.reflect.KClass
1313

1414
private const val metadataFqName = "kotlin.Metadata"

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinNamesAnnotationIntrospector.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector
1414
import com.fasterxml.jackson.databind.util.BeanUtil
1515
import java.lang.reflect.Constructor
1616
import java.lang.reflect.Method
17-
import java.util.Locale
17+
import java.util.*
1818
import kotlin.reflect.KClass
1919
import kotlin.reflect.KFunction
2020
import kotlin.reflect.KParameter

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinSerializers.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
package com.fasterxml.jackson.module.kotlin
44

55
import com.fasterxml.jackson.core.JsonGenerator
6-
import com.fasterxml.jackson.databind.*
6+
import com.fasterxml.jackson.databind.BeanDescription
7+
import com.fasterxml.jackson.databind.JavaType
8+
import com.fasterxml.jackson.databind.JsonSerializer
9+
import com.fasterxml.jackson.databind.SerializationConfig
10+
import com.fasterxml.jackson.databind.SerializerProvider
711
import com.fasterxml.jackson.databind.ser.Serializers
812
import com.fasterxml.jackson.databind.ser.std.StdSerializer
913
import java.math.BigInteger

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,13 @@ internal class KotlinValueInstantiator(
101101
}
102102
tempParamVal
103103
} else {
104-
// trying to get suitable "missing" value provided by deserializer
105-
jsonProp.valueDeserializer?.getNullValue(ctxt)
104+
if(paramDef.type.isMarkedNullable) {
105+
// do not try to create any object if it is nullable and the value is missing
106+
null
107+
} else {
108+
// to get suitable "missing" value provided by deserializer
109+
jsonProp.valueDeserializer?.getAbsentValue(ctxt)
110+
}
106111
}
107112

108113
if (paramVal == null && ((nullToEmptyCollection && jsonProp.type.isCollectionLikeType) || (nullToEmptyMap && jsonProp.type.isMapLikeType))) {

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/ExtensionMethodsTests.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ package com.fasterxml.jackson.module.kotlin.test
33
import com.fasterxml.jackson.databind.ObjectMapper
44
import com.fasterxml.jackson.databind.SerializationFeature
55
import com.fasterxml.jackson.databind.node.JsonNodeFactory
6-
import com.fasterxml.jackson.module.kotlin.*
6+
import com.fasterxml.jackson.module.kotlin.contains
7+
import com.fasterxml.jackson.module.kotlin.convertValue
8+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
9+
import com.fasterxml.jackson.module.kotlin.minusAssign
10+
import com.fasterxml.jackson.module.kotlin.plusAssign
11+
import com.fasterxml.jackson.module.kotlin.readValue
12+
import com.fasterxml.jackson.module.kotlin.treeToValue
713
import org.hamcrest.CoreMatchers.`is`
814
import org.hamcrest.CoreMatchers.equalTo
915
import org.hamcrest.MatcherAssert.assertThat
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.fasterxml.jackson.module.kotlin.test.github
2+
3+
import com.fasterxml.jackson.databind.JsonNode
4+
import com.fasterxml.jackson.databind.node.NullNode
5+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
6+
import com.fasterxml.jackson.module.kotlin.readValue
7+
import org.hamcrest.CoreMatchers
8+
import org.hamcrest.MatcherAssert.assertThat
9+
import org.junit.Test
10+
11+
class TestGithub490 {
12+
val mapper = jacksonObjectMapper()
13+
val value: DataClassWithAllNullableParams = mapper.readValue(
14+
"{" +
15+
"\"jsonNodeValueWithNullAsDefaultProvidedNull\":null, " +
16+
"\"jsonNodeValueProvidedNull\":null}"
17+
)
18+
19+
@Test
20+
fun testKotlinDeserialization_intValue() {
21+
assertThat(
22+
"Nullable missing Int value should be deserialized as null",
23+
value.intValue,
24+
CoreMatchers.nullValue()
25+
)
26+
}
27+
28+
@Test
29+
fun testKotlinDeserialization_stringValue() {
30+
assertThat(
31+
"Nullable missing String value should be deserialized as null",
32+
value.stringValue,
33+
CoreMatchers.nullValue()
34+
)
35+
}
36+
37+
@Test
38+
fun testKotlinDeserialization_jsonNodeValue() {
39+
assertThat(
40+
"Nullable missing JsonNode value should be deserialized as null and not as NullNode",
41+
value.jsonNodeValue,
42+
CoreMatchers.nullValue()
43+
)
44+
}
45+
46+
@Test
47+
fun testKotlinDeserialization_jsonNodeValueProvidedNull() {
48+
assertThat(
49+
"Nullable JsonNode value provided as null should be deserialized as NullNode",
50+
value.jsonNodeValueProvidedNull,
51+
CoreMatchers.equalTo(NullNode.instance)
52+
)
53+
}
54+
55+
@Test
56+
fun testKotlinDeserialization_jsonNodeValueWithNullAsDefault() {
57+
assertThat(
58+
"Nullable by default missing JsonNode value should be deserialized as null and not as NullNode",
59+
value.jsonNodeValueWithNullAsDefault,
60+
CoreMatchers.nullValue()
61+
)
62+
}
63+
64+
@Test
65+
fun testKotlinDeserialization_jsonNodeValueWithNullAsDefaultProvidedNull() {
66+
assertThat(
67+
"Nullable by default JsonNode with provided null value in payload should be deserialized as NullNode",
68+
value.jsonNodeValueWithNullAsDefaultProvidedNull,
69+
CoreMatchers.equalTo(NullNode.instance)
70+
)
71+
}
72+
}
73+
74+
data class DataClassWithAllNullableParams(
75+
val intValue: Int?,
76+
val stringValue: String?,
77+
val jsonNodeValue: JsonNode?,
78+
val jsonNodeValueProvidedNull: JsonNode?,
79+
val jsonNodeValueWithNullAsDefault: JsonNode? = null,
80+
val jsonNodeValueWithNullAsDefaultProvidedNull: JsonNode? = null
81+
)

0 commit comments

Comments
 (0)