@@ -353,16 +353,21 @@ protected Collection<Object> _deserializeFromArray(JsonParser p, Deserialization
353
353
if (_skipNullValues ) {
354
354
continue ;
355
355
}
356
- value = _nullProvider .getNullValue (ctxt );
357
- } else if (_valueTypeDeserializer == null ) {
358
- value = _valueDeserializer .deserialize (p , ctxt );
356
+ value = null ;
359
357
} else {
360
- value = _valueDeserializer . deserializeWithType (p , ctxt , _valueTypeDeserializer );
358
+ value = _deserializeNoNullChecks (p , ctxt );
361
359
}
360
+
362
361
if (value == null ) {
363
- _tryToAddNull (p , ctxt , result );
364
- continue ;
362
+ value = _nullProvider .getNullValue (ctxt );
363
+
364
+ // _skipNullValues is checked by _tryToAddNull.
365
+ if (value == null ) {
366
+ _tryToAddNull (p , ctxt , result );
367
+ continue ;
368
+ }
365
369
}
370
+
366
371
result .add (value );
367
372
368
373
/* 17-Dec-2017, tatu: should not occur at this level...
@@ -398,6 +403,7 @@ protected final Collection<Object> handleNonArray(JsonParser p, DeserializationC
398
403
if (!canWrap ) {
399
404
return (Collection <Object >) ctxt .handleUnexpectedToken (_containerType , p );
400
405
}
406
+
401
407
Object value ;
402
408
403
409
try {
@@ -406,16 +412,19 @@ protected final Collection<Object> handleNonArray(JsonParser p, DeserializationC
406
412
if (_skipNullValues ) {
407
413
return result ;
408
414
}
409
- value = _nullProvider .getNullValue (ctxt );
410
- } else if (_valueTypeDeserializer == null ) {
411
- value = _valueDeserializer .deserialize (p , ctxt );
415
+ value = null ;
412
416
} else {
413
- value = _valueDeserializer . deserializeWithType (p , ctxt , _valueTypeDeserializer );
417
+ value = _deserializeNoNullChecks (p , ctxt );
414
418
}
415
- // _skipNullValues is checked by _tryToAddNull.
419
+
416
420
if (value == null ) {
417
- _tryToAddNull (p , ctxt , result );
418
- return result ;
421
+ value = _nullProvider .getNullValue (ctxt );
422
+
423
+ // _skipNullValues is checked by _tryToAddNull.
424
+ if (value == null ) {
425
+ _tryToAddNull (p , ctxt , result );
426
+ return result ;
427
+ }
419
428
}
420
429
} catch (Exception e ) {
421
430
boolean wrap = ctxt .isEnabled (DeserializationFeature .WRAP_EXCEPTIONS );
@@ -447,18 +456,21 @@ protected Collection<Object> _deserializeWithObjectId(JsonParser p, Deserializat
447
456
while ((t = p .nextToken ()) != JsonToken .END_ARRAY ) {
448
457
try {
449
458
Object value ;
459
+
450
460
if (t == JsonToken .VALUE_NULL ) {
451
461
if (_skipNullValues ) {
452
462
continue ;
453
463
}
454
- value = _nullProvider .getNullValue (ctxt );
455
- } else if (_valueTypeDeserializer == null ) {
456
- value = _valueDeserializer .deserialize (p , ctxt );
464
+ value = null ;
457
465
} else {
458
- value = _valueDeserializer . deserializeWithType (p , ctxt , _valueTypeDeserializer );
466
+ value = _deserializeNoNullChecks (p , ctxt );
459
467
}
460
- if (value == null && _skipNullValues ) {
461
- continue ;
468
+
469
+ if (value == null ) {
470
+ value = _nullProvider .getNullValue (ctxt );
471
+ if (value == null && _skipNullValues ) {
472
+ continue ;
473
+ }
462
474
}
463
475
referringAccumulator .add (value );
464
476
} catch (UnresolvedForwardReference reference ) {
@@ -475,6 +487,22 @@ protected Collection<Object> _deserializeWithObjectId(JsonParser p, Deserializat
475
487
return result ;
476
488
}
477
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 _deserializeNoNullChecks (JsonParser p ,DeserializationContext ctxt )
498
+ throws IOException
499
+ {
500
+ if (_valueTypeDeserializer == null ) {
501
+ return _valueDeserializer .deserialize (p , ctxt );
502
+ }
503
+ return _valueDeserializer .deserializeWithType (p , ctxt , _valueTypeDeserializer );
504
+ }
505
+
478
506
/**
479
507
* {@code java.util.TreeSet} (and possibly other {@link Collection} types) does not
480
508
* allow addition of {@code null} values, so isolate handling here.
0 commit comments