@@ -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 ;
@@ -995,7 +1001,9 @@ protected final float _parseFloatPrimitive(JsonParser p, DeserializationContext
995
1001
break ;
996
1002
case JsonTokenId .ID_START_ARRAY :
997
1003
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
998
- p .nextToken ();
1004
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
1005
+ return (float ) handleNestedArrayForSingle (p , ctxt );
1006
+ }
999
1007
final float parsed = _parseFloatPrimitive (p , ctxt );
1000
1008
_verifyEndArrayForSingle (p , ctxt );
1001
1009
return parsed ;
@@ -1102,7 +1110,9 @@ protected final double _parseDoublePrimitive(JsonParser p, DeserializationContex
1102
1110
break ;
1103
1111
case JsonTokenId .ID_START_ARRAY :
1104
1112
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
1105
- p .nextToken ();
1113
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
1114
+ return (double ) handleNestedArrayForSingle (p , ctxt );
1115
+ }
1106
1116
final double parsed = _parseDoublePrimitive (p , ctxt );
1107
1117
_verifyEndArrayForSingle (p , ctxt );
1108
1118
return parsed ;
@@ -1259,6 +1269,9 @@ protected java.util.Date _parseDateFromArray(JsonParser p, DeserializationContex
1259
1269
default :
1260
1270
}
1261
1271
} else if (unwrap ) {
1272
+ if (t == JsonToken .START_ARRAY ) {
1273
+ return (java .util .Date ) handleNestedArrayForSingle (p , ctxt );
1274
+ }
1262
1275
final Date parsed = _parseDate (p , ctxt );
1263
1276
_verifyEndArrayForSingle (p , ctxt );
1264
1277
return parsed ;
@@ -2039,6 +2052,21 @@ protected void handleMissingEndArrayForSingle(JsonParser p, DeserializationConte
2039
2052
// but for now just fall through
2040
2053
}
2041
2054
2055
+ /**
2056
+ * Helper method called when detecting a deep(er) nesting of Arrays when trying
2057
+ * to unwrap value for {@code DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS}.
2058
+ *
2059
+ * @since 2.13.4.1
2060
+ */
2061
+ protected Object handleNestedArrayForSingle (JsonParser p , DeserializationContext ctxt ) throws IOException
2062
+ {
2063
+ String msg = String .format (
2064
+ "Cannot deserialize instance of %s out of %s token: nested Arrays not allowed with %s" ,
2065
+ ClassUtil .nameOf (_valueClass ), JsonToken .START_ARRAY ,
2066
+ "DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS" );
2067
+ return ctxt .handleUnexpectedToken (getValueType (ctxt ), p .currentToken (), p , msg );
2068
+ }
2069
+
2042
2070
protected void _verifyEndArrayForSingle (JsonParser p , DeserializationContext ctxt ) throws IOException
2043
2071
{
2044
2072
JsonToken t = p .nextToken ();
0 commit comments