@@ -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 ;
@@ -650,7 +650,9 @@ protected final short _parseShortPrimitive(JsonParser p, DeserializationContext
650
650
case JsonTokenId .ID_START_ARRAY :
651
651
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
652
652
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
653
- p .nextToken ();
653
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
654
+ return (short ) handleNestedArrayForSingle (p , ctxt );
655
+ }
654
656
final short parsed = _parseShortPrimitive (p , ctxt );
655
657
_verifyEndArrayForSingle (p , ctxt );
656
658
return parsed ;
@@ -715,7 +717,9 @@ protected final int _parseIntPrimitive(JsonParser p, DeserializationContext ctxt
715
717
break ;
716
718
case JsonTokenId .ID_START_ARRAY :
717
719
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
718
- p .nextToken ();
720
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
721
+ return (int ) handleNestedArrayForSingle (p , ctxt );
722
+ }
719
723
final int parsed = _parseIntPrimitive (p , ctxt );
720
724
_verifyEndArrayForSingle (p , ctxt );
721
725
return parsed ;
@@ -842,7 +846,9 @@ protected final long _parseLongPrimitive(JsonParser p, DeserializationContext ct
842
846
break ;
843
847
case JsonTokenId .ID_START_ARRAY :
844
848
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
845
- p .nextToken ();
849
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
850
+ return (long ) handleNestedArrayForSingle (p , ctxt );
851
+ }
846
852
final long parsed = _parseLongPrimitive (p , ctxt );
847
853
_verifyEndArrayForSingle (p , ctxt );
848
854
return parsed ;
@@ -953,7 +959,9 @@ protected final float _parseFloatPrimitive(JsonParser p, DeserializationContext
953
959
break ;
954
960
case JsonTokenId .ID_START_ARRAY :
955
961
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
956
- p .nextToken ();
962
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
963
+ return (float ) handleNestedArrayForSingle (p , ctxt );
964
+ }
957
965
final float parsed = _parseFloatPrimitive (p , ctxt );
958
966
_verifyEndArrayForSingle (p , ctxt );
959
967
return parsed ;
@@ -1058,7 +1066,9 @@ protected final double _parseDoublePrimitive(JsonParser p, DeserializationContex
1058
1066
break ;
1059
1067
case JsonTokenId .ID_START_ARRAY :
1060
1068
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
1061
- p .nextToken ();
1069
+ if (p .nextToken () == JsonToken .START_ARRAY ) {
1070
+ return (double ) handleNestedArrayForSingle (p , ctxt );
1071
+ }
1062
1072
final double parsed = _parseDoublePrimitive (p , ctxt );
1063
1073
_verifyEndArrayForSingle (p , ctxt );
1064
1074
return parsed ;
@@ -1214,6 +1224,9 @@ protected java.util.Date _parseDateFromArray(JsonParser p, DeserializationContex
1214
1224
default :
1215
1225
}
1216
1226
} else if (unwrap ) {
1227
+ if (t == JsonToken .START_ARRAY ) {
1228
+ return (java .util .Date ) handleNestedArrayForSingle (p , ctxt );
1229
+ }
1217
1230
final Date parsed = _parseDate (p , ctxt );
1218
1231
_verifyEndArrayForSingle (p , ctxt );
1219
1232
return parsed ;
@@ -1990,6 +2003,21 @@ protected void handleMissingEndArrayForSingle(JsonParser p, DeserializationConte
1990
2003
// but for now just fall through
1991
2004
}
1992
2005
2006
+ /**
2007
+ * Helper method called when detecting a deep(er) nesting of Arrays when trying
2008
+ * to unwrap value for {@code DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS}.
2009
+ *
2010
+ * @since 2.14
2011
+ */
2012
+ protected Object handleNestedArrayForSingle (JsonParser p , DeserializationContext ctxt ) throws IOException
2013
+ {
2014
+ String msg = String .format (
2015
+ "Cannot deserialize instance of %s out of %s token: nested Arrays not allowed with %s" ,
2016
+ ClassUtil .nameOf (_valueClass ), JsonToken .START_ARRAY ,
2017
+ "DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS" );
2018
+ return ctxt .handleUnexpectedToken (getValueType (ctxt ), p .currentToken (), p , msg );
2019
+ }
2020
+
1993
2021
protected void _verifyEndArrayForSingle (JsonParser p , DeserializationContext ctxt ) throws IOException
1994
2022
{
1995
2023
JsonToken t = p .nextToken ();
0 commit comments