@@ -341,12 +341,10 @@ protected Collection<Object> _deserializeFromArray(JsonParser p, Deserialization
341
341
// [databind#631]: Assign current value, to be accessible by custom serializers
342
342
p .assignCurrentValue (result );
343
343
344
- JsonDeserializer <Object > valueDes = _valueDeserializer ;
345
344
// Let's offline handling of values with Object Ids (simplifies code here)
346
- if (valueDes .getObjectIdReader () != null ) {
345
+ if (_valueDeserializer .getObjectIdReader () != null ) {
347
346
return _deserializeWithObjectId (p , ctxt , result );
348
347
}
349
- final TypeDeserializer typeDeser = _valueTypeDeserializer ;
350
348
JsonToken t ;
351
349
while ((t = p .nextToken ()) != JsonToken .END_ARRAY ) {
352
350
try {
@@ -355,12 +353,16 @@ protected Collection<Object> _deserializeFromArray(JsonParser p, Deserialization
355
353
if (_skipNullValues ) {
356
354
continue ;
357
355
}
358
- value = _nullProvider .getNullValue (ctxt );
359
- } else if (typeDeser == null ) {
360
- value = valueDes .deserialize (p , ctxt );
356
+ value = null ;
361
357
} else {
362
- value = valueDes .deserializeWithType (p , ctxt , typeDeser );
358
+ value = _deserializeRawContentValue (p , ctxt );
359
+ }
360
+
361
+ if (value == null ) {
362
+ value = _nullProvider .getNullValue (ctxt );
363
363
}
364
+
365
+ // _skipNullValues is checked by _tryToAddNull.
364
366
if (value == null ) {
365
367
_tryToAddNull (p , ctxt , result );
366
368
continue ;
@@ -400,8 +402,6 @@ protected final Collection<Object> handleNonArray(JsonParser p, DeserializationC
400
402
if (!canWrap ) {
401
403
return (Collection <Object >) ctxt .handleUnexpectedToken (_containerType , p );
402
404
}
403
- JsonDeserializer <Object > valueDes = _valueDeserializer ;
404
- final TypeDeserializer typeDeser = _valueTypeDeserializer ;
405
405
406
406
Object value ;
407
407
@@ -411,12 +411,16 @@ protected final Collection<Object> handleNonArray(JsonParser p, DeserializationC
411
411
if (_skipNullValues ) {
412
412
return result ;
413
413
}
414
- value = _nullProvider .getNullValue (ctxt );
415
- } else if (typeDeser == null ) {
416
- value = valueDes .deserialize (p , ctxt );
414
+ value = null ;
417
415
} else {
418
- value = valueDes .deserializeWithType (p , ctxt , typeDeser );
416
+ value = _deserializeRawContentValue (p , ctxt );
417
+ }
418
+
419
+ if (value == null ) {
420
+ value = _nullProvider .getNullValue (ctxt );
419
421
}
422
+
423
+ // _skipNullValues is checked by _tryToAddNull.
420
424
if (value == null ) {
421
425
_tryToAddNull (p , ctxt , result );
422
426
return result ;
@@ -444,25 +448,27 @@ protected Collection<Object> _deserializeWithObjectId(JsonParser p, Deserializat
444
448
// [databind#631]: Assign current value, to be accessible by custom serializers
445
449
p .assignCurrentValue (result );
446
450
447
- final JsonDeserializer <Object > valueDes = _valueDeserializer ;
448
- final TypeDeserializer typeDeser = _valueTypeDeserializer ;
449
451
CollectionReferringAccumulator referringAccumulator =
450
452
new CollectionReferringAccumulator (_containerType .getContentType ().getRawClass (), result );
451
453
452
454
JsonToken t ;
453
455
while ((t = p .nextToken ()) != JsonToken .END_ARRAY ) {
454
456
try {
455
457
Object value ;
458
+
456
459
if (t == JsonToken .VALUE_NULL ) {
457
460
if (_skipNullValues ) {
458
461
continue ;
459
462
}
460
- value = _nullProvider .getNullValue (ctxt );
461
- } else if (typeDeser == null ) {
462
- value = valueDes .deserialize (p , ctxt );
463
+ value = null ;
463
464
} else {
464
- value = valueDes .deserializeWithType (p , ctxt , typeDeser );
465
+ value = _deserializeRawContentValue (p , ctxt );
466
+ }
467
+
468
+ if (value == null ) {
469
+ value = _nullProvider .getNullValue (ctxt );
465
470
}
471
+
466
472
if (value == null && _skipNullValues ) {
467
473
continue ;
468
474
}
@@ -481,6 +487,22 @@ protected Collection<Object> _deserializeWithObjectId(JsonParser p, Deserializat
481
487
return result ;
482
488
}
483
489
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
+
484
506
/**
485
507
* {@code java.util.TreeSet} (and possibly other {@link Collection} types) does not
486
508
* allow addition of {@code null} values, so isolate handling here.
0 commit comments