Skip to content

Commit a7cf222

Browse files
committed
Fixed to always getNullValue if the deserialization result is null
Fixes FasterXML#5139
1 parent 119e7cd commit a7cf222

File tree

1 file changed

+41
-19
lines changed

1 file changed

+41
-19
lines changed

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

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -341,12 +341,10 @@ protected Collection<Object> _deserializeFromArray(JsonParser p, Deserialization
341341
// [databind#631]: Assign current value, to be accessible by custom serializers
342342
p.assignCurrentValue(result);
343343

344-
JsonDeserializer<Object> valueDes = _valueDeserializer;
345344
// Let's offline handling of values with Object Ids (simplifies code here)
346-
if (valueDes.getObjectIdReader() != null) {
345+
if (_valueDeserializer.getObjectIdReader() != null) {
347346
return _deserializeWithObjectId(p, ctxt, result);
348347
}
349-
final TypeDeserializer typeDeser = _valueTypeDeserializer;
350348
JsonToken t;
351349
while ((t = p.nextToken()) != JsonToken.END_ARRAY) {
352350
try {
@@ -355,12 +353,16 @@ protected Collection<Object> _deserializeFromArray(JsonParser p, Deserialization
355353
if (_skipNullValues) {
356354
continue;
357355
}
358-
value = _nullProvider.getNullValue(ctxt);
359-
} else if (typeDeser == null) {
360-
value = valueDes.deserialize(p, ctxt);
356+
value = null;
361357
} else {
362-
value = valueDes.deserializeWithType(p, ctxt, typeDeser);
358+
value = _deserializeRawContentValue(p, ctxt);
359+
}
360+
361+
if (value == null) {
362+
value = _nullProvider.getNullValue(ctxt);
363363
}
364+
365+
// _skipNullValues is checked by _tryToAddNull.
364366
if (value == null) {
365367
_tryToAddNull(p, ctxt, result);
366368
continue;
@@ -400,8 +402,6 @@ protected final Collection<Object> handleNonArray(JsonParser p, DeserializationC
400402
if (!canWrap) {
401403
return (Collection<Object>) ctxt.handleUnexpectedToken(_containerType, p);
402404
}
403-
JsonDeserializer<Object> valueDes = _valueDeserializer;
404-
final TypeDeserializer typeDeser = _valueTypeDeserializer;
405405

406406
Object value;
407407

@@ -411,12 +411,16 @@ protected final Collection<Object> handleNonArray(JsonParser p, DeserializationC
411411
if (_skipNullValues) {
412412
return result;
413413
}
414-
value = _nullProvider.getNullValue(ctxt);
415-
} else if (typeDeser == null) {
416-
value = valueDes.deserialize(p, ctxt);
414+
value = null;
417415
} else {
418-
value = valueDes.deserializeWithType(p, ctxt, typeDeser);
416+
value = _deserializeRawContentValue(p, ctxt);
417+
}
418+
419+
if (value == null) {
420+
value = _nullProvider.getNullValue(ctxt);
419421
}
422+
423+
// _skipNullValues is checked by _tryToAddNull.
420424
if (value == null) {
421425
_tryToAddNull(p, ctxt, result);
422426
return result;
@@ -444,25 +448,27 @@ protected Collection<Object> _deserializeWithObjectId(JsonParser p, Deserializat
444448
// [databind#631]: Assign current value, to be accessible by custom serializers
445449
p.assignCurrentValue(result);
446450

447-
final JsonDeserializer<Object> valueDes = _valueDeserializer;
448-
final TypeDeserializer typeDeser = _valueTypeDeserializer;
449451
CollectionReferringAccumulator referringAccumulator =
450452
new CollectionReferringAccumulator(_containerType.getContentType().getRawClass(), result);
451453

452454
JsonToken t;
453455
while ((t = p.nextToken()) != JsonToken.END_ARRAY) {
454456
try {
455457
Object value;
458+
456459
if (t == JsonToken.VALUE_NULL) {
457460
if (_skipNullValues) {
458461
continue;
459462
}
460-
value = _nullProvider.getNullValue(ctxt);
461-
} else if (typeDeser == null) {
462-
value = valueDes.deserialize(p, ctxt);
463+
value = null;
463464
} else {
464-
value = valueDes.deserializeWithType(p, ctxt, typeDeser);
465+
value = _deserializeRawContentValue(p, ctxt);
466+
}
467+
468+
if (value == null) {
469+
value = _nullProvider.getNullValue(ctxt);
465470
}
471+
466472
if (value == null && _skipNullValues) {
467473
continue;
468474
}
@@ -481,6 +487,22 @@ protected Collection<Object> _deserializeWithObjectId(JsonParser p, Deserializat
481487
return result;
482488
}
483489

490+
/**
491+
* Deserialize the content of the collection.
492+
* If _valueTypeDeserializer is null, use _valueDeserializer.deserialize; if non-null,
493+
* use _valueDeserializer.deserializeWithType to deserialize value.
494+
* This method only performs deserialization and does not consider _skipNullValues, _nullProvider, etc.
495+
* @since 2.19.1
496+
*/
497+
protected Object _deserializeRawContentValue(
498+
JsonParser p,
499+
DeserializationContext ctxt
500+
) throws IOException {
501+
return _valueTypeDeserializer == null
502+
? _valueDeserializer.deserialize(p, ctxt)
503+
: _valueDeserializer.deserializeWithType(p, ctxt, _valueTypeDeserializer);
504+
}
505+
484506
/**
485507
* {@code java.util.TreeSet} (and possibly other {@link Collection} types) does not
486508
* allow addition of {@code null} values, so isolate handling here.

0 commit comments

Comments
 (0)