@@ -290,7 +290,7 @@ protected T _deserializeFromString(JsonParser p, DeserializationContext ctxt)
290
290
if (inst .canCreateFromLong ()) {
291
291
if (ctxt .findCoercionAction (LogicalType .Integer , Long .class ,
292
292
CoercionInputShape .String ) == CoercionAction .TryConvert ) {
293
- return (T ) inst .createFromLong (ctxt , _parseLongPrimitive (ctxt , value ));
293
+ return (T ) inst .createFromLong (ctxt , _parseLongPrimitive (p , ctxt , value ));
294
294
}
295
295
}
296
296
if (inst .canCreateFromBoolean ()) {
@@ -773,12 +773,39 @@ protected final int _parseIntPrimitive(JsonParser p, DeserializationContext ctxt
773
773
_verifyNullForPrimitiveCoercion (ctxt , text );
774
774
return 0 ;
775
775
}
776
- return _parseIntPrimitive (ctxt , text );
776
+ return _parseIntPrimitive (p , ctxt , text );
777
+ }
778
+
779
+ /**
780
+ * @since 2.20
781
+ */
782
+ protected int _parseIntPrimitive (JsonParser p , DeserializationContext ctxt ,
783
+ String text ) throws IOException
784
+ {
785
+ try {
786
+ if (text .length () > 9 ) {
787
+ p .streamReadConstraints ().validateIntegerLength (text .length ());
788
+ long l = NumberInput .parseLong (text );
789
+ if (_intOverflow (l )) {
790
+ Number v = (Number ) ctxt .handleWeirdStringValue (Integer .TYPE , text ,
791
+ "Overflow: numeric value (%s) out of range of int (%d -%d)" ,
792
+ text , Integer .MIN_VALUE , Integer .MAX_VALUE );
793
+ return _nonNullNumber (v ).intValue ();
794
+ }
795
+ return (int ) l ;
796
+ }
797
+ return NumberInput .parseInt (text );
798
+ } catch (IllegalArgumentException iae ) {
799
+ Number v = (Number ) ctxt .handleWeirdStringValue (Integer .TYPE , text ,
800
+ "not a valid `int` value" );
801
+ return _nonNullNumber (v ).intValue ();
802
+ }
777
803
}
778
804
779
805
/**
780
806
* @since 2.9
781
807
*/
808
+ @ Deprecated // since 2.20, use method variant that takes JsonParser
782
809
protected final int _parseIntPrimitive (DeserializationContext ctxt , String text ) throws IOException
783
810
{
784
811
try {
@@ -851,12 +878,37 @@ protected final Integer _parseInteger(JsonParser p, DeserializationContext ctxt,
851
878
if (_checkTextualNull (ctxt , text )) {
852
879
return (Integer ) getNullValue (ctxt );
853
880
}
854
- return _parseInteger (ctxt , text );
881
+ return _parseInteger (p , ctxt , text );
882
+ }
883
+
884
+ /**
885
+ * @since 2.20
886
+ */
887
+ protected Integer _parseInteger (JsonParser p , DeserializationContext ctxt ,
888
+ String text ) throws IOException
889
+ {
890
+ try {
891
+ if (text .length () > 9 ) {
892
+ p .streamReadConstraints ().validateIntegerLength (text .length ());
893
+ long l = NumberInput .parseLong (text );
894
+ if (_intOverflow (l )) {
895
+ return (Integer ) ctxt .handleWeirdStringValue (Integer .class , text ,
896
+ "Overflow: numeric value (%s) out of range of `java.lang.Integer` (%d -%d)" ,
897
+ text , Integer .MIN_VALUE , Integer .MAX_VALUE );
898
+ }
899
+ return Integer .valueOf ((int ) l );
900
+ }
901
+ return NumberInput .parseInt (text );
902
+ } catch (IllegalArgumentException iae ) {
903
+ return (Integer ) ctxt .handleWeirdStringValue (Integer .class , text ,
904
+ "not a valid `java.lang.Integer` value" );
905
+ }
855
906
}
856
907
857
908
/**
858
909
* @since 2.14
859
910
*/
911
+ @ Deprecated // since 2.20, use method variant that takes JsonParser
860
912
protected final Integer _parseInteger (DeserializationContext ctxt , String text ) throws IOException
861
913
{
862
914
try {
@@ -936,12 +988,30 @@ protected final long _parseLongPrimitive(JsonParser p, DeserializationContext ct
936
988
_verifyNullForPrimitiveCoercion (ctxt , text );
937
989
return 0L ;
938
990
}
939
- return _parseLongPrimitive (ctxt , text );
991
+ return _parseLongPrimitive (p , ctxt , text );
992
+ }
993
+
994
+ /**
995
+ * @since 2.20
996
+ */
997
+ protected long _parseLongPrimitive (JsonParser p , DeserializationContext ctxt ,
998
+ String text ) throws IOException
999
+ {
1000
+ p .streamReadConstraints ().validateIntegerLength (text .length ());
1001
+ try {
1002
+ return NumberInput .parseLong (text );
1003
+ } catch (IllegalArgumentException iae ) { }
1004
+ {
1005
+ Number v = (Number ) ctxt .handleWeirdStringValue (Long .TYPE , text ,
1006
+ "not a valid `long` value" );
1007
+ return _nonNullNumber (v ).longValue ();
1008
+ }
940
1009
}
941
1010
942
1011
/**
943
1012
* @since 2.9
944
1013
*/
1014
+ @ Deprecated // since 2.20, use method variant that takes JsonParser
945
1015
protected final long _parseLongPrimitive (DeserializationContext ctxt , String text ) throws IOException
946
1016
{
947
1017
_streamReadConstraints (ctxt ).validateIntegerLength (text .length ());
@@ -1006,12 +1076,27 @@ protected final Long _parseLong(JsonParser p, DeserializationContext ctxt,
1006
1076
return (Long ) getNullValue (ctxt );
1007
1077
}
1008
1078
// let's allow Strings to be converted too
1009
- return _parseLong (ctxt , text );
1079
+ return _parseLong (p , ctxt , text );
1080
+ }
1081
+
1082
+ /**
1083
+ * @since 2.20
1084
+ */
1085
+ protected Long _parseLong (JsonParser p , DeserializationContext ctxt ,
1086
+ String text ) throws IOException
1087
+ {
1088
+ p .streamReadConstraints ().validateIntegerLength (text .length ());
1089
+ try {
1090
+ return NumberInput .parseLong (text );
1091
+ } catch (IllegalArgumentException iae ) { }
1092
+ return (Long ) ctxt .handleWeirdStringValue (Long .class , text ,
1093
+ "not a valid `java.lang.Long` value" );
1010
1094
}
1011
1095
1012
1096
/**
1013
1097
* @since 2.14
1014
1098
*/
1099
+ @ Deprecated // since 2.20, use method variant that takes JsonParser
1015
1100
protected final Long _parseLong (DeserializationContext ctxt , String text ) throws IOException
1016
1101
{
1017
1102
_streamReadConstraints (ctxt ).validateIntegerLength (text .length ());
0 commit comments