Skip to content

Commit 8b9fb0e

Browse files
committed
JOHNZON-424 JohnzonJsonb toJson(Object, Type, OutputStream) crashes for primitive arrays.
1 parent c3a01ef commit 8b9fb0e

File tree

5 files changed

+44
-8
lines changed

5 files changed

+44
-8
lines changed

johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ public void toJson(final Object inObject, final OutputStream stream) throws Json
401401
public void toJson(final Object inObject, final Type runtimeType, final OutputStream stream) throws JsonbException {
402402
final Object object = unwrapOptional(inObject);
403403
if (object != null && isArray(runtimeType)) {
404-
delegate.writeArray((Object[]) object, stream);
404+
delegate.writeArray(object, stream);
405405
} else if (isCollection(runtimeType)) {
406406
delegate.writeArray(Collection.class.cast(object), stream);
407407
} else if (ijson && isNotObjectOrArray(object)) {

johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonJsonbTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,16 @@ public void longArray() {
101101
rule.toJson(input, output);
102102
assertEquals("[0,1,2,3,4,5,6]", new String(output.toByteArray(), StandardCharsets.UTF_8));
103103
}
104+
@Test
105+
public void longArrayWithType() {
106+
long[] input = new long[] { 0L, 1L, 2L, 3L, 4L, 5L, 6L };
107+
final ByteArrayOutputStream output = new ByteArrayOutputStream();
108+
109+
// See JOHNZON-424
110+
rule.toJson(input, long[].class, output);
111+
112+
assertEquals("[0,1,2,3,4,5,6]", new String(output.toByteArray(), StandardCharsets.UTF_8));
113+
}
104114

105115
@Test
106116
public void shortArray() {
@@ -118,6 +128,17 @@ public void booleanArray() {
118128
assertEquals("[true,false]", new String(output.toByteArray(), StandardCharsets.UTF_8));
119129
}
120130

131+
@Test
132+
public void booleanArrayWithType() {
133+
boolean[] input = new boolean[] { true, false };
134+
final ByteArrayOutputStream output = new ByteArrayOutputStream();
135+
136+
// See JOHNZON-424, JOHNZON-425
137+
rule.toJson(input, byte[].class, output);
138+
139+
assertEquals("[true,false]", new String(output.toByteArray(), StandardCharsets.UTF_8));
140+
}
141+
121142
@Test
122143
public void floatArray() {
123144
float[] input = new float[] { 1.0f, 1.1f };

johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/serializer/SerialiseAsPrimitiveTest.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@
1818

1919
import java.lang.reflect.Type;
2020

21+
import org.apache.johnzon.jsonb.test.JsonbRule;
22+
import org.junit.Rule;
2123
import org.junit.Test;
2224

23-
import jakarta.json.bind.Jsonb;
24-
import jakarta.json.bind.JsonbBuilder;
2525
import jakarta.json.bind.annotation.JsonbTypeDeserializer;
2626
import jakarta.json.bind.annotation.JsonbTypeSerializer;
27+
import jakarta.json.bind.config.PropertyOrderStrategy;
2728
import jakarta.json.bind.serializer.DeserializationContext;
2829
import jakarta.json.bind.serializer.JsonbDeserializer;
2930
import jakarta.json.bind.serializer.JsonbSerializer;
@@ -36,8 +37,12 @@
3637
* This test checks a JsonbSerialize/JsonbDeserialize roundtrip when using a primitive as placeholder
3738
*/
3839
public class SerialiseAsPrimitiveTest {
39-
40-
40+
41+
@Rule
42+
public final JsonbRule jsonb = new JsonbRule()
43+
.withPropertyOrderStrategy(PropertyOrderStrategy.LEXICOGRAPHICAL);
44+
45+
4146
public static class TestConstant {
4247
public final static TestConstant VAL_1 = new TestConstant("A");
4348
public final static TestConstant VAL_2 = new TestConstant("B");
@@ -120,8 +125,7 @@ public void testEnumJsonb() {
120125
ConstantUsage enumVerwender = new ConstantUsage();
121126
enumVerwender.setI(1);
122127
enumVerwender.setTestConstant(TestConstant.VAL_2);
123-
124-
Jsonb jsonb = JsonbBuilder.create();
128+
125129
final String json = jsonb.toJson(enumVerwender);
126130
assertTrue(json.contains("\"testConstant\":\"B\""));
127131
}

johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ public <T> void writeArray(final Object object, final OutputStream stream) {
9494
writeObject(ArrayUtil.asList((float[]) object), stream);
9595
} else if (object instanceof double[]) {
9696
writeObject(ArrayUtil.asList((double[]) object), stream);
97+
} else if (object instanceof boolean[]) {
98+
writeObject(ArrayUtil.asList((boolean[]) object), stream);
9799
} else {
98100
writeObject(Arrays.asList((T[]) object), stream);
99101
}

johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,23 @@ public void mapToJsonValueComplex() {
110110
}
111111

112112
@Test
113-
public void mapToJsonArray() {
113+
public void mapToJsonArrayIntPrimitive() {
114114
int[] anArray = new int[]{3, 4, 5};
115115
final JsonValue structure = new MapperBuilder().build().toStructure(anArray);
116116
assertEquals(JsonValue.ValueType.ARRAY, structure.getValueType());
117117
final JsonArray jsonArray = structure.asJsonArray();
118118
assertEquals("[3,4,5]", jsonArray.toString());
119119
}
120120

121+
@Test
122+
public void mapToJsonArrayLongPrimitive() {
123+
long[] anArray = new long[]{3, 4, 5};
124+
final JsonValue structure = new MapperBuilder().build().toStructure(anArray);
125+
assertEquals(JsonValue.ValueType.ARRAY, structure.getValueType());
126+
final JsonArray jsonArray = structure.asJsonArray();
127+
assertEquals("[3,4,5]", jsonArray.toString());
128+
}
129+
121130
@Test
122131
public void mapToJsonList() {
123132
List<Integer> anList = asList(3,4,5);

0 commit comments

Comments
 (0)