@@ -322,9 +322,11 @@ public ValueDeserializer<?> createContextual(DeserializationContext ctxt,
322
322
if (ignorals != null ) {
323
323
Set <String > ignoresToAdd = ignorals .findIgnoredForDeserialization ();
324
324
if (!ignoresToAdd .isEmpty ()) {
325
- ignored = (ignored == null ) ? new HashSet <String >() : new HashSet <String >(ignored );
326
- for (String str : ignoresToAdd ) {
327
- ignored .add (str );
325
+ if (ignored == null ) {
326
+ ignored = new HashSet <>(ignoresToAdd );
327
+ } else {
328
+ ignored = new HashSet <String >(ignored );
329
+ ignored .addAll (ignoresToAdd );
328
330
}
329
331
}
330
332
}
@@ -478,8 +480,6 @@ public Object deserializeWithType(JsonParser p, DeserializationContext ctxt,
478
480
@ SuppressWarnings ("unchecked" )
479
481
public final Class <?> getMapClass () { return (Class <Map <Object ,Object >>) _containerType .getRawClass (); }
480
482
481
- @ Override public JavaType getValueType () { return _containerType ; }
482
-
483
483
/*
484
484
/**********************************************************************
485
485
/* Internal methods, non-merging deserialization
@@ -489,12 +489,8 @@ public Object deserializeWithType(JsonParser p, DeserializationContext ctxt,
489
489
protected final Map <Object ,Object > _readAndBind (JsonParser p , DeserializationContext ctxt ,
490
490
Map <Object ,Object > result ) throws JacksonException
491
491
{
492
- final KeyDeserializer keyDes = _keyDeserializer ;
493
- final ValueDeserializer <Object > valueDes = _valueDeserializer ;
494
- final TypeDeserializer typeDeser = _valueTypeDeserializer ;
495
-
496
492
MapReferringAccumulator referringAccumulator = null ;
497
- boolean useObjectId = valueDes .getObjectIdReader (ctxt ) != null ;
493
+ boolean useObjectId = _valueDeserializer .getObjectIdReader (ctxt ) != null ;
498
494
if (useObjectId ) {
499
495
referringAccumulator = new MapReferringAccumulator (_containerType .getContentType ().getRawClass (),
500
496
result );
@@ -515,7 +511,7 @@ protected final Map<Object,Object> _readAndBind(JsonParser p, DeserializationCon
515
511
}
516
512
517
513
for (; keyStr != null ; keyStr = p .nextName ()) {
518
- Object key = keyDes .deserializeKey (keyStr , ctxt );
514
+ Object key = _keyDeserializer .deserializeKey (keyStr , ctxt );
519
515
// And then the value...
520
516
JsonToken t = p .nextToken ();
521
517
if ((_inclusionChecker != null ) && _inclusionChecker .shouldIgnore (keyStr )) {
@@ -530,10 +526,8 @@ protected final Map<Object,Object> _readAndBind(JsonParser p, DeserializationCon
530
526
continue ;
531
527
}
532
528
value = _nullProvider .getNullValue (ctxt );
533
- } else if (typeDeser == null ) {
534
- value = valueDes .deserialize (p , ctxt );
535
529
} else {
536
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
530
+ value = _deserializeNoNullChecks (p , ctxt );
537
531
}
538
532
if (useObjectId ) {
539
533
referringAccumulator .put (key , value );
@@ -560,10 +554,8 @@ protected final Map<Object,Object> _readAndBind(JsonParser p, DeserializationCon
560
554
protected final Map <Object ,Object > _readAndBindStringKeyMap (JsonParser p , DeserializationContext ctxt ,
561
555
Map <Object ,Object > result ) throws JacksonException
562
556
{
563
- final ValueDeserializer <Object > valueDes = _valueDeserializer ;
564
- final TypeDeserializer typeDeser = _valueTypeDeserializer ;
565
557
MapReferringAccumulator referringAccumulator = null ;
566
- boolean useObjectId = (valueDes .getObjectIdReader (ctxt ) != null );
558
+ boolean useObjectId = (_valueDeserializer .getObjectIdReader (ctxt ) != null );
567
559
if (useObjectId ) {
568
560
referringAccumulator = new MapReferringAccumulator (_containerType .getContentType ().getRawClass (), result );
569
561
}
@@ -596,10 +588,8 @@ protected final Map<Object,Object> _readAndBindStringKeyMap(JsonParser p, Deseri
596
588
continue ;
597
589
}
598
590
value = _nullProvider .getNullValue (ctxt );
599
- } else if (typeDeser == null ) {
600
- value = valueDes .deserialize (p , ctxt );
601
591
} else {
602
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
592
+ value = _deserializeNoNullChecks (p , ctxt );
603
593
}
604
594
if (useObjectId ) {
605
595
referringAccumulator .put (key , value );
@@ -628,9 +618,6 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser p, Deserialization
628
618
// null -> no ObjectIdReader for Maps (yet?)
629
619
PropertyValueBuffer buffer = creator .startBuilding (p , ctxt , null );
630
620
631
- final ValueDeserializer <Object > valueDes = _valueDeserializer ;
632
- final TypeDeserializer typeDeser = _valueTypeDeserializer ;
633
-
634
621
String key ;
635
622
if (p .isExpectedStartObjectToken ()) {
636
623
key = p .nextName ();
@@ -672,10 +659,8 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser p, Deserialization
672
659
continue ;
673
660
}
674
661
value = _nullProvider .getNullValue (ctxt );
675
- } else if (typeDeser == null ) {
676
- value = valueDes .deserialize (p , ctxt );
677
662
} else {
678
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
663
+ value = _deserializeNoNullChecks (p , ctxt );
679
664
}
680
665
} catch (Exception e ) {
681
666
wrapAndThrow (ctxt , e , _containerType .getRawClass (), key );
@@ -702,7 +687,6 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser p, Deserialization
702
687
protected final void _readAndUpdate (JsonParser p , DeserializationContext ctxt ,
703
688
Map <Object ,Object > result ) throws JacksonException
704
689
{
705
- final KeyDeserializer keyDes = _keyDeserializer ;
706
690
final ValueDeserializer <Object > valueDes = _valueDeserializer ;
707
691
final TypeDeserializer typeDeser = _valueTypeDeserializer ;
708
692
@@ -724,7 +708,7 @@ protected final void _readAndUpdate(JsonParser p, DeserializationContext ctxt,
724
708
}
725
709
726
710
for (; keyStr != null ; keyStr = p .nextName ()) {
727
- Object key = keyDes .deserializeKey (keyStr , ctxt );
711
+ Object key = _keyDeserializer .deserializeKey (keyStr , ctxt );
728
712
// And then the value...
729
713
JsonToken t = p .nextToken ();
730
714
if ((_inclusionChecker != null ) && _inclusionChecker .shouldIgnore (keyStr )) {
@@ -748,10 +732,8 @@ protected final void _readAndUpdate(JsonParser p, DeserializationContext ctxt,
748
732
} else {
749
733
value = valueDes .deserializeWithType (p , ctxt , typeDeser , old );
750
734
}
751
- } else if (typeDeser == null ) {
752
- value = valueDes .deserialize (p , ctxt );
753
735
} else {
754
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
736
+ value = _deserializeNoNullChecks (p , ctxt );
755
737
}
756
738
if (value != old ) {
757
739
result .put (key , value );
@@ -813,10 +795,8 @@ protected final void _readAndUpdateStringKeyMap(JsonParser p, DeserializationCon
813
795
} else {
814
796
value = valueDes .deserializeWithType (p , ctxt , typeDeser , old );
815
797
}
816
- } else if (typeDeser == null ) {
817
- value = valueDes .deserialize (p , ctxt );
818
798
} else {
819
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
799
+ value = _deserializeNoNullChecks (p , ctxt );
820
800
}
821
801
if (value != old ) {
822
802
result .put (key , value );
@@ -827,6 +807,22 @@ protected final void _readAndUpdateStringKeyMap(JsonParser p, DeserializationCon
827
807
}
828
808
}
829
809
810
+ /**
811
+ * Deserialize the content of the map.
812
+ * If _valueTypeDeserializer is null, use _valueDeserializer.deserialize; if non-null,
813
+ * use _valueDeserializer.deserializeWithType to deserialize value.
814
+ * This method only performs deserialization and does not consider _skipNullValues, _nullProvider, etc.
815
+ * @since 2.19.2
816
+ */
817
+ protected Object _deserializeNoNullChecks (JsonParser p , DeserializationContext ctxt )
818
+ throws JacksonException
819
+ {
820
+ if (_valueTypeDeserializer == null ) {
821
+ return _valueDeserializer .deserialize (p , ctxt );
822
+ }
823
+ return _valueDeserializer .deserializeWithType (p , ctxt , _valueTypeDeserializer );
824
+ }
825
+
830
826
/**
831
827
* @since 2.14
832
828
*/
@@ -869,11 +865,11 @@ private void handleUnresolvedReference(DeserializationContext ctxt,
869
865
870
866
private final static class MapReferringAccumulator {
871
867
private final Class <?> _valueType ;
872
- private Map <Object ,Object > _result ;
868
+ private final Map <Object ,Object > _result ;
873
869
/**
874
870
* A list of {@link MapReferring} to maintain ordering.
875
871
*/
876
- private List <MapReferring > _accumulator = new ArrayList <MapReferring >();
872
+ private final List <MapReferring > _accumulator = new ArrayList <MapReferring >();
877
873
878
874
public MapReferringAccumulator (Class <?> valueType , Map <Object , Object > result ) {
879
875
_valueType = valueType ;
0 commit comments