Skip to content
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

JOHNZON-326 Fix for handling primitive arrays in JsonB #69

Merged
merged 2 commits into from
Dec 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,12 @@ private Object[] toArray(final Object object) {
for (int i = 0; i < length; i++) {
array[i] = ((short[])object)[i];
}
} else if (boolean.class == componentType) {
final int length = ArrayUtil.getArrayLength(object);
array = new Boolean[length];
for (int i = 0; i < length; i++) {
array[i] = ((boolean[])object)[i];
}
} else {
array = (Object[]) object;
}
Expand All @@ -327,7 +333,7 @@ private Object[] toArray(final Object object) {
public String toJson(final Object inObject, final Type runtimeType) throws JsonbException {
final Object object = unwrapOptional(inObject);
if (object != null && isArray(runtimeType)) {
return delegate.writeArrayAsString((Object[]) object);
return delegate.writeArrayAsString(toArray(object));
} else if (isCollection(runtimeType)) {
return delegate.writeArrayAsString(Collection.class.cast(object));
} else if (ijson && isNotObjectOrArray(object)) {
Expand Down Expand Up @@ -378,7 +384,7 @@ public void toJson(final Object inObject, final Type runtimeType, final Writer w
public void toJson(final Object inObject, final OutputStream stream) throws JsonbException {
final Object object = unwrapOptional(inObject);
if (object != null && isArray(object.getClass())) {
delegate.writeArray((Object[]) object, stream);
delegate.writeArray(toArray(object), stream);
} else if (Collection.class.isInstance(object)) {
delegate.writeArray(Collection.class.cast(object), stream);
} else if (ijson && isNotObjectOrArray(object)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import org.junit.Rule;
import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class JohnzonJsonbTest {
Expand Down Expand Up @@ -68,6 +70,126 @@ public void longBounds() {
assertEquals(Long.MIN_VALUE, rule.fromJson(min, LongWrapper.class).value, 0);
}

@Test
public void intArray() {
int[] input = new int[] { 0, 1, 2, 3, 4, 5, 6 };
final ByteArrayOutputStream output = new ByteArrayOutputStream();
rule.toJson(input, output);
assertEquals("[0,1,2,3,4,5,6]", new String(output.toByteArray(), StandardCharsets.UTF_8));
}

@Test
public void charArray() {
char[] input = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };
final ByteArrayOutputStream output = new ByteArrayOutputStream();
rule.toJson(input, output);
assertEquals("[\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\"]", new String(output.toByteArray(), StandardCharsets.UTF_8));
}

@Test
public void byteArray() {
byte[] input = new byte[] { 0x00, 0x01 };
final ByteArrayOutputStream output = new ByteArrayOutputStream();
rule.toJson(input, output);
assertEquals("[0,1]", new String(output.toByteArray(), StandardCharsets.UTF_8));
}

@Test
public void longArray() {
long[] input = new long[] { 0L, 1L, 2L, 3L, 4L, 5L, 6L };
final ByteArrayOutputStream output = new ByteArrayOutputStream();
rule.toJson(input, output);
assertEquals("[0,1,2,3,4,5,6]", new String(output.toByteArray(), StandardCharsets.UTF_8));
}

@Test
public void shortArray() {
short[] input = new short[] { 0, 1, 2 };
final ByteArrayOutputStream output = new ByteArrayOutputStream();
rule.toJson(input, output);
assertEquals("[0,1,2]", new String(output.toByteArray(), StandardCharsets.UTF_8));
}

@Test
public void booleanArray() {
boolean[] input = new boolean[] { true, false };
final ByteArrayOutputStream output = new ByteArrayOutputStream();
rule.toJson(input, output);
assertEquals("[true,false]", new String(output.toByteArray(), StandardCharsets.UTF_8));
}

@Test
public void floatArray() {
float[] input = new float[] { 1.0f, 1.1f };
final ByteArrayOutputStream output = new ByteArrayOutputStream();
rule.toJson(input, output);
assertEquals("[1.0,1.1]", new String(output.toByteArray(), StandardCharsets.UTF_8));
}

@Test
public void doubleArray() {
double[] input = new double[] { 1.0, 1.1 };
final ByteArrayOutputStream output = new ByteArrayOutputStream();
rule.toJson(input, output);
assertEquals("[1.0,1.1]", new String(output.toByteArray(), StandardCharsets.UTF_8));
}

@Test
public void intArrayRuntimeType() {
int[] input = new int[] { 0, 1, 2, 3, 4, 5, 6 };
final String output = rule.toJson(input, int[].class);
assertEquals("[0,1,2,3,4,5,6]", output);
}

@Test
public void charArrayRuntimeType() {
char[] input = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };
final String output = rule.toJson(input, char[].class);
assertEquals("[\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\"]", output);
}

@Test
public void byteArrayRuntimeType() {
byte[] input = new byte[] { 0x00, 0x01 };
final String output = rule.toJson(input, byte[].class);
assertEquals("[0,1]", output);
}

@Test
public void longArrayRuntimeType() {
long[] input = new long[] { 0L, 1L, 2L, 3L, 4L, 5L, 6L };
final String output = rule.toJson(input, long[].class);
assertEquals("[0,1,2,3,4,5,6]", output);
}

@Test
public void shortArrayRuntimeType() {
short[] input = new short[] { 0, 1, 2 };
final String output = rule.toJson(input, short[].class);
assertEquals("[0,1,2]", output);
}

@Test
public void booleanArrayRuntimeType() {
boolean[] input = new boolean[] { true, false };
final String output = rule.toJson(input, boolean[].class);
assertEquals("[true,false]", output);
}

@Test
public void floatArrayRuntimeType() {
float[] input = new float[] { 1.0f, 1.1f };
final String output = rule.toJson(input, float[].class);
assertEquals("[1.0,1.1]", output);
}

@Test
public void doubleArrayRuntimeType() {
double[] input = new double[] { 1.0, 1.1 };
final String output = rule.toJson(input, double[].class);
assertEquals("[1.0,1.1]", output);
}

public static class LongWrapper {
public Long value;

Expand Down