-
Notifications
You must be signed in to change notification settings - Fork 36
Add support for reading boolean/short/float arrays #197
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 2.x
Are you sure you want to change the base?
Changes from 2 commits
31ccba6
c7737f3
cad3743
502599e
8127f5d
55d5c16
2ba10bf
a681f70
7f08a2b
8d9f3e5
2eecf8d
282d5bc
1d18a11
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,6 +27,11 @@ | |
public class SimpleValueReader extends ValueReader | ||
{ | ||
private final static int[] NO_INTS = new int[0]; | ||
private final static long[] NO_LONGS = new long[0]; | ||
private final static boolean[] NO_BOOLEANS = new boolean[0]; | ||
private final static short[] NO_SHORTS = new short[0]; | ||
private final static float[] NO_FLOATS = new float[0]; | ||
private final static double[] NO_DOUBLES = new double[0]; | ||
|
||
protected final int _typeId; | ||
|
||
|
@@ -110,6 +115,16 @@ public Object read(JSONReader reader, JsonParser p) throws IOException | |
|
||
case SER_INT_ARRAY: | ||
return _readIntArray(p); | ||
case SER_LONG_ARRAY: | ||
return _readLongArray(p); | ||
case SER_BOOLEAN_ARRAY: | ||
return _readBooleanArray(p); | ||
case SER_SHORT_ARRAY: | ||
return _readShortArray(p); | ||
case SER_FLOAT_ARRAY: | ||
return _readFloatArray(p); | ||
case SER_DOUBLE_ARRAY: | ||
return _readDoubleArray(p); | ||
|
||
case SER_TREE_NODE: | ||
return reader.readTree(); | ||
|
@@ -328,6 +343,190 @@ protected int[] _readIntArray(JsonParser p) throws IOException { | |
return builder.build().toArray(); | ||
} | ||
|
||
protected long[] _readLongArray(JsonParser p) throws IOException { | ||
if (JsonToken.START_ARRAY.equals(p.currentToken())) { | ||
p.nextToken(); | ||
} | ||
|
||
java.util.List<Long> values = new java.util.ArrayList<>(); | ||
|
||
int t = p.currentTokenId(); | ||
|
||
if (t == JsonTokenId.ID_END_ARRAY) { | ||
return NO_LONGS; | ||
} | ||
|
||
main_loop: | ||
while (true) { | ||
switch (t) { | ||
case JsonTokenId.ID_NUMBER_FLOAT: | ||
case JsonTokenId.ID_NUMBER_INT: | ||
case JsonTokenId.ID_NULL: | ||
values.add(p.getValueAsLong()); | ||
break; | ||
case JsonTokenId.ID_END_ARRAY: | ||
break main_loop; | ||
default: | ||
throw new JSONObjectException("Failed to bind `long` element if `long[]` from value: "+ | ||
|
||
_tokenDesc(p)); | ||
} | ||
p.nextToken(); | ||
t = p.currentTokenId(); | ||
} | ||
long[] result = new long[values.size()]; | ||
for (int i = 0; i < result.length; i++) { | ||
result[i] = values.get(i); | ||
} | ||
return result; | ||
} | ||
|
||
protected boolean[] _readBooleanArray(JsonParser p) throws IOException { | ||
if (JsonToken.START_ARRAY.equals(p.currentToken())) { | ||
p.nextToken(); | ||
} | ||
|
||
java.util.List<Boolean> values = new java.util.ArrayList<>(); | ||
|
||
int t = p.currentTokenId(); | ||
|
||
if (t == JsonTokenId.ID_END_ARRAY) { | ||
return NO_BOOLEANS; | ||
} | ||
|
||
main_loop: | ||
while (true) { | ||
switch (t) { | ||
case JsonTokenId.ID_TRUE: | ||
values.add(Boolean.TRUE); | ||
break; | ||
case JsonTokenId.ID_FALSE: | ||
values.add(Boolean.FALSE); | ||
break; | ||
case JsonTokenId.ID_NULL: | ||
values.add(Boolean.FALSE); | ||
break; | ||
case JsonTokenId.ID_END_ARRAY: | ||
break main_loop; | ||
default: | ||
throw new JSONObjectException("Failed to bind `boolean` element if `boolean[]` from value: "+ | ||
_tokenDesc(p)); | ||
} | ||
p.nextToken(); | ||
t = p.currentTokenId(); | ||
} | ||
boolean[] result = new boolean[values.size()]; | ||
for (int i = 0; i < result.length; i++) { | ||
result[i] = values.get(i); | ||
} | ||
return result; | ||
} | ||
|
||
protected short[] _readShortArray(JsonParser p) throws IOException { | ||
if (JsonToken.START_ARRAY.equals(p.currentToken())) { | ||
p.nextToken(); | ||
} | ||
|
||
java.util.List<Short> values = new java.util.ArrayList<>(); | ||
int t = p.currentTokenId(); | ||
|
||
if (t == JsonTokenId.ID_END_ARRAY) { | ||
return NO_SHORTS; | ||
} | ||
|
||
main_loop: | ||
while (true) { | ||
switch (t) { | ||
case JsonTokenId.ID_NUMBER_FLOAT: | ||
case JsonTokenId.ID_NUMBER_INT: | ||
case JsonTokenId.ID_NULL: | ||
values.add((short) p.getValueAsInt()); | ||
break; | ||
case JsonTokenId.ID_END_ARRAY: | ||
break main_loop; | ||
default: | ||
throw new JSONObjectException("Failed to bind `short` element if `short[]` from value: "+ | ||
_tokenDesc(p)); | ||
} | ||
p.nextToken(); | ||
t = p.currentTokenId(); | ||
} | ||
short[] result = new short[values.size()]; | ||
for (int i = 0; i < result.length; i++) { | ||
result[i] = values.get(i); | ||
} | ||
return result; | ||
} | ||
|
||
protected float[] _readFloatArray(JsonParser p) throws IOException { | ||
if (JsonToken.START_ARRAY.equals(p.currentToken())) { | ||
p.nextToken(); | ||
} | ||
|
||
java.util.List<Float> values = new java.util.ArrayList<>(); | ||
int t = p.currentTokenId(); | ||
|
||
if (t == JsonTokenId.ID_END_ARRAY) { | ||
return NO_FLOATS; | ||
} | ||
|
||
main_loop: | ||
while (true) { | ||
switch (t) { | ||
case JsonTokenId.ID_NUMBER_FLOAT: | ||
case JsonTokenId.ID_NUMBER_INT: | ||
case JsonTokenId.ID_NULL: | ||
values.add((float) p.getValueAsDouble()); | ||
break; | ||
case JsonTokenId.ID_END_ARRAY: | ||
break main_loop; | ||
default: | ||
throw new JSONObjectException("Failed to bind `float` element if `float[]` from value: "+ | ||
_tokenDesc(p)); | ||
} | ||
p.nextToken(); | ||
t = p.currentTokenId(); | ||
} | ||
float[] result = new float[values.size()]; | ||
for (int i = 0; i < result.length; i++) { | ||
result[i] = values.get(i); | ||
} | ||
return result; | ||
} | ||
|
||
protected double[] _readDoubleArray(JsonParser p) throws IOException { | ||
if (JsonToken.START_ARRAY.equals(p.currentToken())) { | ||
p.nextToken(); | ||
} | ||
|
||
java.util.List<Double> values = new java.util.ArrayList<>(); | ||
int t = p.currentTokenId(); | ||
|
||
if (t == JsonTokenId.ID_END_ARRAY) { | ||
return NO_DOUBLES; | ||
} | ||
|
||
main_loop: | ||
while (true) { | ||
switch (t) { | ||
case JsonTokenId.ID_NUMBER_FLOAT: | ||
case JsonTokenId.ID_NUMBER_INT: | ||
case JsonTokenId.ID_NULL: | ||
values.add(p.getValueAsDouble()); | ||
break; | ||
case JsonTokenId.ID_END_ARRAY: | ||
break main_loop; | ||
default: | ||
throw new JSONObjectException("Failed to bind `double` element if `double[]` from value: "+ | ||
_tokenDesc(p)); | ||
} | ||
p.nextToken(); | ||
t = p.currentTokenId(); | ||
} | ||
double[] result = new double[values.size()]; | ||
for (int i = 0; i < result.length; i++) { | ||
result[i] = values.get(i); | ||
} | ||
return result; | ||
} | ||
|
||
protected long _fetchLong(JsonParser p) throws IOException | ||
{ | ||
JsonToken t = p.currentToken(); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -61,6 +61,9 @@ public abstract class ValueLocatorBase | |
public final static int SER_INT_ARRAY = 5; | ||
public final static int SER_LONG_ARRAY = 6; | ||
public final static int SER_BOOLEAN_ARRAY = 7; | ||
public final static int SER_SHORT_ARRAY = 38; | ||
|
||
public final static int SER_FLOAT_ARRAY = 39; | ||
public final static int SER_DOUBLE_ARRAY = 40; | ||
|
||
/** | ||
* An implementation of {@link com.fasterxml.jackson.core.TreeNode} | ||
|
@@ -159,6 +162,15 @@ protected int _findSimpleType(Class<?> raw, boolean forSer) | |
if (raw == boolean[].class) { | ||
return SER_BOOLEAN_ARRAY; | ||
} | ||
if (raw == short[].class) { | ||
return SER_SHORT_ARRAY; | ||
} | ||
if (raw == float[].class) { | ||
return SER_FLOAT_ARRAY; | ||
} | ||
if (raw == double[].class) { | ||
return SER_DOUBLE_ARRAY; | ||
} | ||
// Hmmh. Could support all types; add as/when needed | ||
return SER_UNKNOWN; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This class looks good.