@@ -357,12 +357,8 @@ protected T _deserializeWrappedValue(JsonParser p, DeserializationContext ctxt)
357
357
// 23-Mar-2017, tatu: Let's specifically block recursive resolution to avoid
358
358
// either supporting nested arrays, or to cause infinite looping.
359
359
if (p .hasToken (JsonToken .START_ARRAY )) {
360
- String msg = String .format (
361
- "Cannot deserialize instance of %s out of %s token: nested Arrays not allowed with %s" ,
362
- ClassUtil .nameOf (_valueClass ), JsonToken .START_ARRAY ,
363
- "DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS" );
364
360
@ SuppressWarnings ("unchecked" )
365
- T result = (T ) ctxt . handleUnexpectedToken ( getValueType ( ctxt ), p . currentToken (), p , msg );
361
+ T result = (T ) handleNestedArrayForSingle ( p , ctxt );
366
362
return result ;
367
363
}
368
364
return (T ) deserialize (p , ctxt );
@@ -413,7 +409,9 @@ protected final boolean _parseBooleanPrimitive(JsonParser p, DeserializationCont
413
409
case JsonTokenId .ID_START_ARRAY :
414
410
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
415
411
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
416
- p .nextToken ();
412
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
413
+ return (boolean ) handleNestedArrayForSingle (p , ctxt );
414
+ }
417
415
final boolean parsed = _parseBooleanPrimitive (p , ctxt );
418
416
_verifyEndArrayForSingle (p , ctxt );
419
417
return parsed ;
@@ -582,7 +580,9 @@ protected final byte _parseBytePrimitive(JsonParser p, DeserializationContext ct
582
580
case JsonTokenId .ID_START_ARRAY : // unwrapping / from-empty-array coercion?
583
581
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
584
582
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
585
- p .nextToken ();
583
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
584
+ return (byte ) handleNestedArrayForSingle (p , ctxt );
585
+ }
586
586
final byte parsed = _parseBytePrimitive (p , ctxt );
587
587
_verifyEndArrayForSingle (p , ctxt );
588
588
return parsed ;
@@ -652,7 +652,9 @@ protected final short _parseShortPrimitive(JsonParser p, DeserializationContext
652
652
case JsonTokenId .ID_START_ARRAY :
653
653
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
654
654
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
655
- p .nextToken ();
655
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
656
+ return (short ) handleNestedArrayForSingle (p , ctxt );
657
+ }
656
658
final short parsed = _parseShortPrimitive (p , ctxt );
657
659
_verifyEndArrayForSingle (p , ctxt );
658
660
return parsed ;
@@ -719,7 +721,9 @@ protected final int _parseIntPrimitive(JsonParser p, DeserializationContext ctxt
719
721
break ;
720
722
case JsonTokenId .ID_START_ARRAY :
721
723
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
722
- p .nextToken ();
724
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
725
+ return (int ) handleNestedArrayForSingle (p , ctxt );
726
+ }
723
727
final int parsed = _parseIntPrimitive (p , ctxt );
724
728
_verifyEndArrayForSingle (p , ctxt );
725
729
return parsed ;
@@ -870,7 +874,9 @@ protected final long _parseLongPrimitive(JsonParser p, DeserializationContext ct
870
874
break ;
871
875
case JsonTokenId .ID_START_ARRAY :
872
876
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
873
- p .nextToken ();
877
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
878
+ return (long ) handleNestedArrayForSingle (p , ctxt );
879
+ }
874
880
final long parsed = _parseLongPrimitive (p , ctxt );
875
881
_verifyEndArrayForSingle (p , ctxt );
876
882
return parsed ;
@@ -1003,7 +1009,9 @@ protected final float _parseFloatPrimitive(JsonParser p, DeserializationContext
1003
1009
break ;
1004
1010
case JsonTokenId .ID_START_ARRAY :
1005
1011
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
1006
- p .nextToken ();
1012
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
1013
+ return (float ) handleNestedArrayForSingle (p , ctxt );
1014
+ }
1007
1015
final float parsed = _parseFloatPrimitive (p , ctxt );
1008
1016
_verifyEndArrayForSingle (p , ctxt );
1009
1017
return parsed ;
@@ -1132,7 +1140,9 @@ protected final double _parseDoublePrimitive(JsonParser p, DeserializationContex
1132
1140
break ;
1133
1141
case JsonTokenId .ID_START_ARRAY :
1134
1142
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
1135
- p .nextToken ();
1143
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
1144
+ return (double ) handleNestedArrayForSingle (p , ctxt );
1145
+ }
1136
1146
final double parsed = _parseDoublePrimitive (p , ctxt );
1137
1147
_verifyEndArrayForSingle (p , ctxt );
1138
1148
return parsed ;
@@ -1313,6 +1323,9 @@ protected java.util.Date _parseDateFromArray(JsonParser p, DeserializationContex
1313
1323
default :
1314
1324
}
1315
1325
} else if (unwrap ) {
1326
+ if (t == JsonToken .START_ARRAY ) {
1327
+ return (java .util .Date ) handleNestedArrayForSingle (p , ctxt );
1328
+ }
1316
1329
final Date parsed = _parseDate (p , ctxt );
1317
1330
_verifyEndArrayForSingle (p , ctxt );
1318
1331
return parsed ;
@@ -2109,6 +2122,21 @@ protected void handleMissingEndArrayForSingle(JsonParser p, DeserializationConte
2109
2122
// but for now just fall through
2110
2123
}
2111
2124
2125
+ /**
2126
+ * Helper method called when detecting a deep(er) nesting of Arrays when trying
2127
+ * to unwrap value for {@code DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS}.
2128
+ *
2129
+ * @since 2.14
2130
+ */
2131
+ protected Object handleNestedArrayForSingle (JsonParser p , DeserializationContext ctxt ) throws IOException
2132
+ {
2133
+ String msg = String .format (
2134
+ "Cannot deserialize instance of %s out of %s token: nested Arrays not allowed with %s" ,
2135
+ ClassUtil .nameOf (_valueClass ), JsonToken .START_ARRAY ,
2136
+ "DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS" );
2137
+ return ctxt .handleUnexpectedToken (getValueType (ctxt ), p .currentToken (), p , msg );
2138
+ }
2139
+
2112
2140
protected void _verifyEndArrayForSingle (JsonParser p , DeserializationContext ctxt ) throws IOException
2113
2141
{
2114
2142
JsonToken t = p .nextToken ();
0 commit comments