@@ -343,9 +343,11 @@ public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
343
343
if (ignorals != null ) {
344
344
Set <String > ignoresToAdd = ignorals .findIgnoredForDeserialization ();
345
345
if (!ignoresToAdd .isEmpty ()) {
346
- ignored = (ignored == null ) ? new HashSet <String >() : new HashSet <String >(ignored );
347
- for (String str : ignoresToAdd ) {
348
- ignored .add (str );
346
+ if (ignored == null ) {
347
+ ignored = new HashSet <>(ignoresToAdd );
348
+ } else {
349
+ ignored = new HashSet <String >(ignored );
350
+ ignored .addAll (ignoresToAdd );
349
351
}
350
352
}
351
353
}
@@ -500,8 +502,6 @@ public Object deserializeWithType(JsonParser p, DeserializationContext ctxt,
500
502
@ SuppressWarnings ("unchecked" )
501
503
public final Class <?> getMapClass () { return (Class <Map <Object ,Object >>) _containerType .getRawClass (); }
502
504
503
- @ Override public JavaType getValueType () { return _containerType ; }
504
-
505
505
/*
506
506
/**********************************************************
507
507
/* Internal methods, non-merging deserialization
@@ -511,12 +511,8 @@ public Object deserializeWithType(JsonParser p, DeserializationContext ctxt,
511
511
protected final Map <Object ,Object > _readAndBind (JsonParser p , DeserializationContext ctxt ,
512
512
Map <Object ,Object > result ) throws IOException
513
513
{
514
- final KeyDeserializer keyDes = _keyDeserializer ;
515
- final JsonDeserializer <Object > valueDes = _valueDeserializer ;
516
- final TypeDeserializer typeDeser = _valueTypeDeserializer ;
517
-
518
514
MapReferringAccumulator referringAccumulator = null ;
519
- boolean useObjectId = valueDes .getObjectIdReader () != null ;
515
+ boolean useObjectId = _valueDeserializer .getObjectIdReader () != null ;
520
516
if (useObjectId ) {
521
517
referringAccumulator = new MapReferringAccumulator (_containerType .getContentType ().getRawClass (),
522
518
result );
@@ -537,7 +533,7 @@ protected final Map<Object,Object> _readAndBind(JsonParser p, DeserializationCon
537
533
}
538
534
539
535
for (; keyStr != null ; keyStr = p .nextFieldName ()) {
540
- Object key = keyDes .deserializeKey (keyStr , ctxt );
536
+ Object key = _keyDeserializer .deserializeKey (keyStr , ctxt );
541
537
// And then the value...
542
538
JsonToken t = p .nextToken ();
543
539
if ((_inclusionChecker != null ) && _inclusionChecker .shouldIgnore (keyStr )) {
@@ -552,10 +548,8 @@ protected final Map<Object,Object> _readAndBind(JsonParser p, DeserializationCon
552
548
continue ;
553
549
}
554
550
value = _nullProvider .getNullValue (ctxt );
555
- } else if (typeDeser == null ) {
556
- value = valueDes .deserialize (p , ctxt );
557
551
} else {
558
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
552
+ value = _deserializeNoNullChecks (p , ctxt );
559
553
}
560
554
if (useObjectId ) {
561
555
referringAccumulator .put (key , value );
@@ -582,10 +576,8 @@ protected final Map<Object,Object> _readAndBind(JsonParser p, DeserializationCon
582
576
protected final Map <Object ,Object > _readAndBindStringKeyMap (JsonParser p , DeserializationContext ctxt ,
583
577
Map <Object ,Object > result ) throws IOException
584
578
{
585
- final JsonDeserializer <Object > valueDes = _valueDeserializer ;
586
- final TypeDeserializer typeDeser = _valueTypeDeserializer ;
587
579
MapReferringAccumulator referringAccumulator = null ;
588
- boolean useObjectId = (valueDes .getObjectIdReader () != null );
580
+ boolean useObjectId = (_valueDeserializer .getObjectIdReader () != null );
589
581
if (useObjectId ) {
590
582
referringAccumulator = new MapReferringAccumulator (_containerType .getContentType ().getRawClass (), result );
591
583
}
@@ -618,10 +610,8 @@ protected final Map<Object,Object> _readAndBindStringKeyMap(JsonParser p, Deseri
618
610
continue ;
619
611
}
620
612
value = _nullProvider .getNullValue (ctxt );
621
- } else if (typeDeser == null ) {
622
- value = valueDes .deserialize (p , ctxt );
623
613
} else {
624
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
614
+ value = _deserializeNoNullChecks (p , ctxt );
625
615
}
626
616
if (useObjectId ) {
627
617
referringAccumulator .put (key , value );
@@ -649,9 +639,6 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser p, Deserialization
649
639
// null -> no ObjectIdReader for Maps (yet?)
650
640
PropertyValueBuffer buffer = creator .startBuilding (p , ctxt , null );
651
641
652
- final JsonDeserializer <Object > valueDes = _valueDeserializer ;
653
- final TypeDeserializer typeDeser = _valueTypeDeserializer ;
654
-
655
642
String key ;
656
643
if (p .isExpectedStartObjectToken ()) {
657
644
key = p .nextFieldName ();
@@ -693,10 +680,8 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser p, Deserialization
693
680
continue ;
694
681
}
695
682
value = _nullProvider .getNullValue (ctxt );
696
- } else if (typeDeser == null ) {
697
- value = valueDes .deserialize (p , ctxt );
698
683
} else {
699
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
684
+ value = _deserializeNoNullChecks (p , ctxt );
700
685
}
701
686
} catch (Exception e ) {
702
687
wrapAndThrow (ctxt , e , _containerType .getRawClass (), key );
@@ -726,7 +711,6 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser p, Deserialization
726
711
protected final void _readAndUpdate (JsonParser p , DeserializationContext ctxt ,
727
712
Map <Object ,Object > result ) throws IOException
728
713
{
729
- final KeyDeserializer keyDes = _keyDeserializer ;
730
714
final JsonDeserializer <Object > valueDes = _valueDeserializer ;
731
715
final TypeDeserializer typeDeser = _valueTypeDeserializer ;
732
716
@@ -748,7 +732,7 @@ protected final void _readAndUpdate(JsonParser p, DeserializationContext ctxt,
748
732
}
749
733
750
734
for (; keyStr != null ; keyStr = p .nextFieldName ()) {
751
- Object key = keyDes .deserializeKey (keyStr , ctxt );
735
+ Object key = _keyDeserializer .deserializeKey (keyStr , ctxt );
752
736
// And then the value...
753
737
JsonToken t = p .nextToken ();
754
738
if ((_inclusionChecker != null ) && _inclusionChecker .shouldIgnore (keyStr )) {
@@ -772,10 +756,8 @@ protected final void _readAndUpdate(JsonParser p, DeserializationContext ctxt,
772
756
} else {
773
757
value = valueDes .deserializeWithType (p , ctxt , typeDeser , old );
774
758
}
775
- } else if (typeDeser == null ) {
776
- value = valueDes .deserialize (p , ctxt );
777
759
} else {
778
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
760
+ value = _deserializeNoNullChecks (p , ctxt );
779
761
}
780
762
if (value != old ) {
781
763
result .put (key , value );
@@ -839,10 +821,8 @@ protected final void _readAndUpdateStringKeyMap(JsonParser p, DeserializationCon
839
821
} else {
840
822
value = valueDes .deserializeWithType (p , ctxt , typeDeser , old );
841
823
}
842
- } else if (typeDeser == null ) {
843
- value = valueDes .deserialize (p , ctxt );
844
824
} else {
845
- value = valueDes . deserializeWithType (p , ctxt , typeDeser );
825
+ value = _deserializeNoNullChecks (p , ctxt );
846
826
}
847
827
if (value != old ) {
848
828
result .put (key , value );
@@ -853,6 +833,22 @@ protected final void _readAndUpdateStringKeyMap(JsonParser p, DeserializationCon
853
833
}
854
834
}
855
835
836
+ /**
837
+ * Deserialize the content of the map.
838
+ * If _valueTypeDeserializer is null, use _valueDeserializer.deserialize; if non-null,
839
+ * use _valueDeserializer.deserializeWithType to deserialize value.
840
+ * This method only performs deserialization and does not consider _skipNullValues, _nullProvider, etc.
841
+ * @since 2.19.2
842
+ */
843
+ protected Object _deserializeNoNullChecks (JsonParser p , DeserializationContext ctxt )
844
+ throws IOException
845
+ {
846
+ if (_valueTypeDeserializer == null ) {
847
+ return _valueDeserializer .deserialize (p , ctxt );
848
+ }
849
+ return _valueDeserializer .deserializeWithType (p , ctxt , _valueTypeDeserializer );
850
+ }
851
+
856
852
/**
857
853
* @since 2.14
858
854
*/
@@ -895,11 +891,11 @@ private void handleUnresolvedReference(DeserializationContext ctxt,
895
891
896
892
private final static class MapReferringAccumulator {
897
893
private final Class <?> _valueType ;
898
- private Map <Object ,Object > _result ;
894
+ private final Map <Object ,Object > _result ;
899
895
/**
900
896
* A list of {@link MapReferring} to maintain ordering.
901
897
*/
902
- private List <MapReferring > _accumulator = new ArrayList <MapReferring >();
898
+ private final List <MapReferring > _accumulator = new ArrayList <MapReferring >();
903
899
904
900
public MapReferringAccumulator (Class <?> valueType , Map <Object , Object > result ) {
905
901
_valueType = valueType ;
0 commit comments