24
24
import com .fasterxml .jackson .core .JsonToken ;
25
25
import jakarta .json .JsonArray ;
26
26
import jakarta .json .JsonArrayBuilder ;
27
+ import jakarta .json .JsonNumber ;
27
28
import jakarta .json .JsonObject ;
28
29
import jakarta .json .JsonObjectBuilder ;
29
30
import jakarta .json .JsonValue ;
30
31
import jakarta .json .spi .JsonProvider ;
31
32
import jakarta .json .stream .JsonParsingException ;
32
33
33
34
import java .io .IOException ;
35
+ import java .math .BigDecimal ;
36
+ import java .math .BigInteger ;
34
37
35
38
/**
36
39
* 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 {
65
68
}
66
69
67
70
public JsonValue parseValue (JsonParser parser ) throws IOException {
71
+ JsonToken jsonToken = parser .currentToken ();
68
72
switch (parser .currentToken ()) {
69
73
case START_OBJECT :
70
74
return parseObject (parser );
@@ -93,7 +97,8 @@ public JsonValue parseValue(JsonParser parser) throws IOException {
93
97
return provider .createValue (parser .getLongValue ());
94
98
case FLOAT :
95
99
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 ());
97
102
case BIG_DECIMAL :
98
103
return provider .createValue (parser .getDecimalValue ());
99
104
case BIG_INTEGER :
@@ -105,4 +110,95 @@ public JsonValue parseValue(JsonParser parser) throws IOException {
105
110
106
111
}
107
112
}
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
+ }
108
204
}
0 commit comments