Skip to content

Commit 5ad9622

Browse files
committed
Merge pull request #407 from wpalmeri/null-deser-cleanup
Fix deser of null values for collection/array type deserializers
2 parents 72ce52f + e602790 commit 5ad9622

File tree

8 files changed

+64
-12
lines changed

8 files changed

+64
-12
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/std/ArrayBlockingQueueDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public Collection<Object> deserialize(JsonParser jp, DeserializationContext ctxt
102102
Object value;
103103

104104
if (t == JsonToken.VALUE_NULL) {
105-
value = null;
105+
value = valueDes.getNullValue();
106106
} else if (typeDeser == null) {
107107
value = valueDes.deserialize(jp, ctxt);
108108
} else {

src/main/java/com/fasterxml/jackson/databind/deser/std/CollectionDeserializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ public Collection<Object> deserialize(JsonParser jp, DeserializationContext ctxt
226226
try {
227227
Object value;
228228
if (t == JsonToken.VALUE_NULL) {
229-
value = null;
229+
value = valueDes.getNullValue();
230230
} else if (typeDeser == null) {
231231
value = valueDes.deserialize(jp, ctxt);
232232
} else {
@@ -278,7 +278,7 @@ protected final Collection<Object> handleNonArray(JsonParser jp, Deserialization
278278
Object value;
279279

280280
if (t == JsonToken.VALUE_NULL) {
281-
value = null;
281+
value = valueDes.getNullValue();
282282
} else if (typeDeser == null) {
283283
value = valueDes.deserialize(jp, ctxt);
284284
} else {

src/main/java/com/fasterxml/jackson/databind/deser/std/EnumMapDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public EnumMap<?,?> deserialize(JsonParser jp, DeserializationContext ctxt) thro
141141
Object value;
142142

143143
if (t == JsonToken.VALUE_NULL) {
144-
value = null;
144+
value = valueDes.getNullValue();
145145
} else if (typeDeser == null) {
146146
value = valueDes.deserialize(jp, ctxt);
147147
} else {

src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ protected final void _readAndBind(JsonParser jp, DeserializationContext ctxt,
391391
// Note: must handle null explicitly here; value deserializers won't
392392
Object value;
393393
if (t == JsonToken.VALUE_NULL) {
394-
value = null;
394+
value = valueDes.getNullValue();
395395
} else if (typeDeser == null) {
396396
value = valueDes.deserialize(jp, ctxt);
397397
} else {
@@ -445,7 +445,7 @@ protected final void _readAndBindStringMap(JsonParser jp, DeserializationContext
445445
// Note: must handle null explicitly here; value deserializers won't
446446
Object value;
447447
if (t == JsonToken.VALUE_NULL) {
448-
value = null;
448+
value = valueDes.getNullValue();
449449
} else if (typeDeser == null) {
450450
value = valueDes.deserialize(jp, ctxt);
451451
} else {
@@ -507,7 +507,7 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser jp, Deserializatio
507507
Object key = _keyDeserializer.deserializeKey(fieldName, ctxt);
508508
Object value;
509509
if (t == JsonToken.VALUE_NULL) {
510-
value = null;
510+
value = valueDes.getNullValue();
511511
} else if (typeDeser == null) {
512512
value = valueDes.deserialize(jp, ctxt);
513513
} else {

src/main/java/com/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public Object[] deserialize(JsonParser jp, DeserializationContext ctxt)
144144
Object value;
145145

146146
if (t == JsonToken.VALUE_NULL) {
147-
value = null;
147+
value = _elementDeserializer.getNullValue();
148148
} else if (typeDeser == null) {
149149
value = _elementDeserializer.deserialize(jp, ctxt);
150150
} else {
@@ -225,7 +225,7 @@ private final Object[] handleNonArray(JsonParser jp, DeserializationContext ctxt
225225
Object value;
226226

227227
if (t == JsonToken.VALUE_NULL) {
228-
value = null;
228+
value = _elementDeserializer.getNullValue();
229229
} else if (_elementTypeDeserializer == null) {
230230
value = _elementDeserializer.deserialize(jp, ctxt);
231231
} else {

src/main/java/com/fasterxml/jackson/databind/deser/std/StringArrayDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public String[] deserialize(JsonParser jp, DeserializationContext ctxt) throws I
6363
if (t == JsonToken.VALUE_STRING) {
6464
value = jp.getText();
6565
} else if (t == JsonToken.VALUE_NULL) {
66-
value = null;
66+
value = _elementDeserializer.getNullValue();
6767
} else {
6868
value = _parseString(jp, ctxt);
6969
}

src/main/java/com/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ private Collection<String> deserializeUsingCustom(JsonParser jp, Deserialization
183183
String value;
184184

185185
if (t == JsonToken.VALUE_NULL) {
186-
value = null;
186+
value = deser.getNullValue();
187187
} else {
188188
value = deser.deserialize(jp, ctxt);
189189
}
@@ -216,7 +216,7 @@ private final Collection<String> handleNonArray(JsonParser jp, DeserializationCo
216216
String value;
217217

218218
if (t == JsonToken.VALUE_NULL) {
219-
value = null;
219+
value = (valueDes == null) ? null : valueDes.getNullValue();
220220
} else {
221221
value = (valueDes == null) ? _parseString(jp, ctxt) : valueDes.deserialize(jp, ctxt);
222222
}

src/test/java/com/fasterxml/jackson/databind/deser/TestNullHandling.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.fasterxml.jackson.databind.deser;
22

33
import java.io.IOException;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
import java.util.Map;
47

58

69
import com.fasterxml.jackson.core.*;
10+
import com.fasterxml.jackson.core.type.TypeReference;
711
import com.fasterxml.jackson.databind.*;
812
import com.fasterxml.jackson.databind.module.SimpleModule;
913

@@ -51,4 +55,52 @@ public void testCustomRootNulls() throws Exception
5155
assertNotNull(str);
5256
assertEquals("funny", str);
5357
}
58+
59+
// Test for [jackson-databind-407]
60+
public void testListOfNulls() throws Exception
61+
{
62+
ObjectMapper mapper = new ObjectMapper();
63+
SimpleModule module = new SimpleModule("test", Version.unknownVersion());
64+
module.addDeserializer(String.class, new FunnyNullDeserializer());
65+
mapper.registerModule(module);
66+
67+
List<String> list = Arrays.asList("funny");
68+
JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, String.class);
69+
70+
// should get non-default null directly:
71+
List deser = mapper.readValue("[null]", type);
72+
assertNotNull(deser);
73+
assertEquals(1, deser.size());
74+
assertEquals(list.get(0), deser.get(0));
75+
76+
// as well as via ObjectReader
77+
ObjectReader reader = mapper.reader(type);
78+
deser = reader.readValue("[null]");
79+
assertNotNull(deser);
80+
assertEquals(1, deser.size());
81+
assertEquals(list.get(0), deser.get(0));
82+
}
83+
84+
// Test for [jackson-databind-407]
85+
public void testMapOfNulls() throws Exception
86+
{
87+
ObjectMapper mapper = new ObjectMapper();
88+
SimpleModule module = new SimpleModule("test", Version.unknownVersion());
89+
module.addDeserializer(String.class, new FunnyNullDeserializer());
90+
mapper.registerModule(module);
91+
92+
JavaType type = mapper.getTypeFactory().constructMapType(Map.class, String.class, String.class);
93+
// should get non-default null directly:
94+
Map deser = mapper.readValue("{\"key\":null}", type);
95+
assertNotNull(deser);
96+
assertEquals(1, deser.size());
97+
assertEquals("funny", deser.get("key"));
98+
99+
// as well as via ObjectReader
100+
ObjectReader reader = mapper.reader(type);
101+
deser = mapper.readValue("{\"key\":null}", type);
102+
assertNotNull(deser);
103+
assertEquals(1, deser.size());
104+
assertEquals("funny", deser.get("key"));
105+
}
54106
}

0 commit comments

Comments
 (0)