2424import  com .fasterxml .jackson .core .JsonToken ;
2525import  jakarta .json .JsonArray ;
2626import  jakarta .json .JsonArrayBuilder ;
27+ import  jakarta .json .JsonNumber ;
2728import  jakarta .json .JsonObject ;
2829import  jakarta .json .JsonObjectBuilder ;
2930import  jakarta .json .JsonValue ;
3031import  jakarta .json .spi .JsonProvider ;
3132import  jakarta .json .stream .JsonParsingException ;
3233
3334import  java .io .IOException ;
35+ import  java .math .BigDecimal ;
36+ import  java .math .BigInteger ;
3437
3538/** 
3639 * Reads a Jsonp value/object/array from a Jackson parser. The parser's current token should be the start of the 
@@ -65,6 +68,7 @@ public JsonArray parseArray(JsonParser parser) throws IOException {
6568    }
6669
6770    public  JsonValue  parseValue (JsonParser  parser ) throws  IOException  {
71+         JsonToken  jsonToken  = parser .currentToken ();
6872        switch  (parser .currentToken ()) {
6973            case  START_OBJECT :
7074                return  parseObject (parser );
@@ -93,7 +97,8 @@ public JsonValue parseValue(JsonParser parser) throws IOException {
9397                        return  provider .createValue (parser .getLongValue ());
9498                    case  FLOAT :
9599                    case  DOUBLE :
96-                         return  provider .createValue (parser .getDoubleValue ());
100+                         // Use double also for floats, as JSON-P has no support for float 
101+                         return  new  DoubleNumber (parser .getDoubleValue ());
97102                    case  BIG_DECIMAL :
98103                        return  provider .createValue (parser .getDecimalValue ());
99104                    case  BIG_INTEGER :
@@ -105,4 +110,95 @@ public JsonValue parseValue(JsonParser parser) throws IOException {
105110
106111        }
107112    }
113+ 
114+     private  static  class  DoubleNumber  implements  JsonNumber  {
115+ 
116+         private  final  double  value ;
117+ 
118+         DoubleNumber (double  value ) {
119+             this .value  = value ;
120+         }
121+ 
122+         @ Override 
123+         public  boolean  isIntegral () {
124+             return  false ;
125+         }
126+ 
127+         @ Override 
128+         public  int  intValue () {
129+             return  (int ) value ;
130+         }
131+ 
132+         @ Override 
133+         public  int  intValueExact () {
134+             int  result  = (int ) value ;
135+ 
136+             if  ((double )result  == value ) {
137+                 return  result ;
138+             } else  {
139+                 throw  new  ArithmeticException ();
140+             }
141+         }
142+ 
143+         @ Override 
144+         public  long  longValue () {
145+             return  (long ) value ;
146+         }
147+ 
148+         @ Override 
149+         public  long  longValueExact () {
150+             long  result  = (long ) value ;
151+ 
152+             if  ((double )result  == value ) {
153+                 return  result ;
154+             } else  {
155+                 throw  new  ArithmeticException ();
156+             }
157+         }
158+ 
159+         @ Override 
160+         public  BigInteger  bigIntegerValue () {
161+             return  bigDecimalValue ().toBigInteger ();
162+         }
163+ 
164+         @ Override 
165+         public  BigInteger  bigIntegerValueExact () {
166+             return  bigDecimalValue ().toBigIntegerExact ();
167+         }
168+ 
169+         @ Override 
170+         public  double  doubleValue () {
171+             return  value ;
172+         }
173+ 
174+         @ Override 
175+         public  BigDecimal  bigDecimalValue () {
176+             return  new  BigDecimal (value );
177+         }
178+ 
179+         @ Override 
180+         public  ValueType  getValueType () {
181+             return  ValueType .NUMBER ;
182+         }
183+ 
184+         @ Override 
185+         public  Number  numberValue () {
186+             return  value ;
187+         }
188+ 
189+         @ Override 
190+         public  String  toString () {
191+             return  String .valueOf (value );
192+         }
193+ 
194+         @ Override 
195+         public  int  hashCode () {
196+             return  Double .hashCode (value );
197+         }
198+ 
199+         @ Override 
200+         public  boolean  equals (Object  obj ) {
201+             return  obj  instanceof  DoubleNumber  && ((DoubleNumber )obj ).value  == value ;
202+         }
203+     }
108204}
0 commit comments