Skip to content

Commit 8e67685

Browse files
committed
Fixes #78: add wrapper types for most numbers
1 parent 1781de7 commit 8e67685

File tree

7 files changed

+209
-134
lines changed

7 files changed

+209
-134
lines changed

jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/JSONWriter.java

+30-6
Original file line numberDiff line numberDiff line change
@@ -217,16 +217,24 @@ public void writeField(String fieldName, Object value, int type) throws IOExcept
217217
writeBigIntegerField(fieldName, (BigInteger) value);
218218
return;
219219
case SER_NUMBER_FLOAT: // fall through
220+
case SER_NUMBER_FLOAT_WRAPPER:
221+
writeFloatField(fieldName, ((Float) value).floatValue());
222+
return;
220223
case SER_NUMBER_DOUBLE:
221-
writeDoubleField(fieldName, ((Number) value).doubleValue());
224+
case SER_NUMBER_DOUBLE_WRAPPER:
225+
writeDoubleField(fieldName, ((Double) value).doubleValue());
222226
return;
223227
case SER_NUMBER_BYTE: // fall through
224228
case SER_NUMBER_SHORT: // fall through
225-
case SER_NUMBER_INTEGER:
226229
writeIntField(fieldName, ((Number) value).intValue());
227230
return;
231+
case SER_NUMBER_INTEGER:
232+
case SER_NUMBER_INTEGER_WRAPPER:
233+
writeIntField(fieldName, ((Integer) value).intValue());
234+
return;
228235
case SER_NUMBER_LONG:
229-
writeLongField(fieldName, ((Number) value).longValue());
236+
case SER_NUMBER_LONG_WRAPPER:
237+
writeLongField(fieldName, ((Long) value).longValue());
230238
return;
231239

232240
// Scalar types:
@@ -328,16 +336,24 @@ protected void _writeValue(Object value, int type) throws IOException
328336
// Number types:
329337

330338
case SER_NUMBER_FLOAT: // fall through
339+
case SER_NUMBER_FLOAT_WRAPPER: // fall through
340+
writeFloatValue(((Float) value).floatValue());
341+
return;
331342
case SER_NUMBER_DOUBLE:
332-
writeDoubleValue(((Number) value).doubleValue());
343+
case SER_NUMBER_DOUBLE_WRAPPER:
344+
writeDoubleValue(((Double) value).doubleValue());
333345
return;
334346
case SER_NUMBER_BYTE: // fall through
335347
case SER_NUMBER_SHORT: // fall through
336-
case SER_NUMBER_INTEGER:
337348
writeIntValue(((Number) value).intValue());
338349
return;
350+
case SER_NUMBER_INTEGER:
351+
case SER_NUMBER_INTEGER_WRAPPER:
352+
writeIntValue(((Integer) value).intValue());
353+
return;
339354
case SER_NUMBER_LONG:
340-
writeLongValue(((Number) value).longValue());
355+
case SER_NUMBER_LONG_WRAPPER:
356+
writeLongValue(((Long) value).longValue());
341357
return;
342358
case SER_NUMBER_BIG_DECIMAL:
343359
writeBigDecimalValue((BigDecimal) value);
@@ -584,6 +600,14 @@ protected void writeLongField(String fieldName, long v) throws IOException {
584600
_generator.writeNumberField(fieldName, v);
585601
}
586602

603+
protected void writeFloatValue(float v) throws IOException {
604+
_generator.writeNumber(v);
605+
}
606+
607+
protected void writeFloatField(String fieldName, float v) throws IOException {
608+
_generator.writeNumberField(fieldName, v);
609+
}
610+
587611
protected void writeDoubleValue(double v) throws IOException {
588612
_generator.writeNumber(v);
589613
}

jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/SimpleValueReader.java

+19-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public Object readNext(JSONReader reader, JsonParser p) throws IOException
6060
// cases default to "standard" handling which does range checks etc
6161

6262
case SER_NUMBER_INTEGER:
63+
case SER_NUMBER_INTEGER_WRAPPER:
6364
{
6465
int i = p.nextIntValue(-2);
6566
if (i != -2) {
@@ -69,6 +70,7 @@ public Object readNext(JSONReader reader, JsonParser p) throws IOException
6970
}
7071

7172
case SER_NUMBER_LONG:
73+
case SER_NUMBER_LONG_WRAPPER:
7274
{
7375
long l = p.nextLongValue(-2L);
7476
if (l != -2L) {
@@ -116,8 +118,16 @@ public Object read(JSONReader reader, JsonParser p) throws IOException
116118

117119
// Number types:
118120

119-
case SER_NUMBER_FLOAT: // fall through
121+
case SER_NUMBER_FLOAT_WRAPPER:
122+
if (p.hasToken(JsonToken.VALUE_NULL)) {
123+
return null;
124+
}
125+
case SER_NUMBER_FLOAT:
120126
return Float.valueOf((float) p.getValueAsDouble());
127+
case SER_NUMBER_DOUBLE_WRAPPER:
128+
if (p.hasToken(JsonToken.VALUE_NULL)) {
129+
return null;
130+
}
121131
case SER_NUMBER_DOUBLE:
122132
return p.getValueAsDouble();
123133

@@ -126,8 +136,16 @@ public Object read(JSONReader reader, JsonParser p) throws IOException
126136

127137
case SER_NUMBER_SHORT: // fall through
128138
return (short) p.getValueAsInt();
139+
case SER_NUMBER_INTEGER_WRAPPER:
140+
if (p.hasToken(JsonToken.VALUE_NULL)) {
141+
return null;
142+
}
129143
case SER_NUMBER_INTEGER:
130144
return p.getValueAsInt();
145+
case SER_NUMBER_LONG_WRAPPER:
146+
if (p.hasToken(JsonToken.VALUE_NULL)) {
147+
return null;
148+
}
131149
case SER_NUMBER_LONG:
132150
return p.getValueAsLong();
133151

jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueLocatorBase.java

+28-24
Original file line numberDiff line numberDiff line change
@@ -78,35 +78,39 @@ public abstract class ValueLocatorBase
7878
public final static int SER_NUMBER_BYTE = 13;
7979

8080
public final static int SER_NUMBER_SHORT = 14;
81-
81+
8282
public final static int SER_NUMBER_INTEGER = 15;
83+
public final static int SER_NUMBER_INTEGER_WRAPPER = 16;
8384

84-
public final static int SER_NUMBER_LONG = 16;
85+
public final static int SER_NUMBER_LONG = 17;
86+
public final static int SER_NUMBER_LONG_WRAPPER = 18;
8587

86-
public final static int SER_NUMBER_FLOAT = 17;
88+
public final static int SER_NUMBER_FLOAT = 19;
89+
public final static int SER_NUMBER_FLOAT_WRAPPER = 20;
8790

88-
public final static int SER_NUMBER_DOUBLE = 18;
91+
public final static int SER_NUMBER_DOUBLE = 21;
92+
public final static int SER_NUMBER_DOUBLE_WRAPPER = 22;
8993

90-
public final static int SER_NUMBER_BIG_INTEGER = 19;
94+
public final static int SER_NUMBER_BIG_INTEGER = 23;
9195

92-
public final static int SER_NUMBER_BIG_DECIMAL = 20;
96+
public final static int SER_NUMBER_BIG_DECIMAL = 24;
9397

9498
// // // Other specific scalar types
9599

96-
public final static int SER_BOOLEAN = 21;
97-
public final static int SER_BOOLEAN_WRAPPER = 22;
98-
public final static int SER_CHAR = 23;
100+
public final static int SER_BOOLEAN = 25;
101+
public final static int SER_BOOLEAN_WRAPPER = 26;
102+
public final static int SER_CHAR = 27;
99103

100-
public final static int SER_ENUM = 24;
104+
public final static int SER_ENUM = 28;
101105

102-
public final static int SER_DATE = 25;
103-
public final static int SER_CALENDAR = 26;
106+
public final static int SER_DATE = 29;
107+
public final static int SER_CALENDAR = 30;
104108

105-
public final static int SER_CLASS = 27;
106-
public final static int SER_FILE = 28;
107-
public final static int SER_UUID = 29;
108-
public final static int SER_URL = 30;
109-
public final static int SER_URI = 31;
109+
public final static int SER_CLASS = 31;
110+
public final static int SER_FILE = 32;
111+
public final static int SER_UUID = 33;
112+
public final static int SER_URL = 34;
113+
public final static int SER_URI = 35;
110114

111115

112116
// // // Iterate-able types
@@ -115,7 +119,7 @@ public abstract class ValueLocatorBase
115119
* Anything that implements {@link java.lang.Iterable}, but not
116120
* {@link java.util.Collection}.
117121
*/
118-
public final static int SER_ITERABLE = 32;
122+
public final static int SER_ITERABLE = 36;
119123

120124
/*
121125
/**********************************************************************
@@ -174,16 +178,16 @@ protected int _findSimpleType(Class<?> raw, boolean forSer)
174178
return SER_BOOLEAN_WRAPPER;
175179
}
176180
if (Number.class.isAssignableFrom(raw)) {
177-
if (raw == Integer.class) return SER_NUMBER_INTEGER;
178-
if (raw == Long.class) return SER_NUMBER_LONG;
179-
if (raw == Byte.class) return SER_NUMBER_BYTE;
180-
if (raw == Short.class) return SER_NUMBER_SHORT;
181-
if (raw == Double.class) return SER_NUMBER_DOUBLE;
182-
if (raw == Float.class) return SER_NUMBER_FLOAT;
181+
if (raw == Integer.class) return SER_NUMBER_INTEGER_WRAPPER;
182+
if (raw == Long.class) return SER_NUMBER_LONG_WRAPPER;
183+
if (raw == Double.class) return SER_NUMBER_DOUBLE_WRAPPER;
184+
if (raw == Float.class) return SER_NUMBER_FLOAT_WRAPPER;
183185
if (raw == BigDecimal.class) return SER_NUMBER_BIG_DECIMAL;
184186
if (raw == BigInteger.class) {
185187
return SER_NUMBER_BIG_INTEGER;
186188
}
189+
if (raw == Byte.class) return SER_NUMBER_BYTE;
190+
if (raw == Short.class) return SER_NUMBER_SHORT;
187191
// What numeric type is this? Could consider "string-like" but...
188192
return SER_UNKNOWN;
189193
}

jr-objects/src/test/java/com/fasterxml/jackson/jr/failing/NullHandling78Test.java

-100
This file was deleted.

0 commit comments

Comments
 (0)