This is an automated email from the ASF dual-hosted git repository. struberg pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/johnzon.git
commit 8b9fb0ef9ddab5218ca02360da639dce4e01e7c8 Author: Mark Struberg <[email protected]> AuthorDate: Fri Feb 20 15:50:52 2026 +0100 JOHNZON-424 JohnzonJsonb toJson(Object, Type, OutputStream) crashes for primitive arrays. --- .../java/org/apache/johnzon/jsonb/JohnzonJsonb.java | 2 +- .../org/apache/johnzon/jsonb/JohnzonJsonbTest.java | 21 +++++++++++++++++++++ .../jsonb/serializer/SerialiseAsPrimitiveTest.java | 16 ++++++++++------ .../main/java/org/apache/johnzon/mapper/Mapper.java | 2 ++ .../java/org/apache/johnzon/mapper/MapperTest.java | 11 ++++++++++- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java index 12f12bed..5f33a27d 100644 --- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java +++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java @@ -401,7 +401,7 @@ public class JohnzonJsonb implements Jsonb, AutoCloseable, JsonbExtension { public void toJson(final Object inObject, final Type runtimeType, final OutputStream stream) throws JsonbException { final Object object = unwrapOptional(inObject); if (object != null && isArray(runtimeType)) { - delegate.writeArray((Object[]) object, stream); + delegate.writeArray(object, stream); } else if (isCollection(runtimeType)) { delegate.writeArray(Collection.class.cast(object), stream); } else if (ijson && isNotObjectOrArray(object)) { diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonJsonbTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonJsonbTest.java index 9410fb56..80478712 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonJsonbTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JohnzonJsonbTest.java @@ -101,6 +101,16 @@ public class JohnzonJsonbTest { rule.toJson(input, output); assertEquals("[0,1,2,3,4,5,6]", new String(output.toByteArray(), StandardCharsets.UTF_8)); } + @Test + public void longArrayWithType() { + long[] input = new long[] { 0L, 1L, 2L, 3L, 4L, 5L, 6L }; + final ByteArrayOutputStream output = new ByteArrayOutputStream(); + + // See JOHNZON-424 + rule.toJson(input, long[].class, output); + + assertEquals("[0,1,2,3,4,5,6]", new String(output.toByteArray(), StandardCharsets.UTF_8)); + } @Test public void shortArray() { @@ -118,6 +128,17 @@ public class JohnzonJsonbTest { assertEquals("[true,false]", new String(output.toByteArray(), StandardCharsets.UTF_8)); } + @Test + public void booleanArrayWithType() { + boolean[] input = new boolean[] { true, false }; + final ByteArrayOutputStream output = new ByteArrayOutputStream(); + + // See JOHNZON-424, JOHNZON-425 + rule.toJson(input, byte[].class, output); + + assertEquals("[true,false]", new String(output.toByteArray(), StandardCharsets.UTF_8)); + } + @Test public void floatArray() { float[] input = new float[] { 1.0f, 1.1f }; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/serializer/SerialiseAsPrimitiveTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/serializer/SerialiseAsPrimitiveTest.java index 8c2a1a63..c62504ff 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/serializer/SerialiseAsPrimitiveTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/serializer/SerialiseAsPrimitiveTest.java @@ -18,12 +18,13 @@ package org.apache.johnzon.jsonb.serializer; import java.lang.reflect.Type; +import org.apache.johnzon.jsonb.test.JsonbRule; +import org.junit.Rule; import org.junit.Test; -import jakarta.json.bind.Jsonb; -import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.annotation.JsonbTypeDeserializer; import jakarta.json.bind.annotation.JsonbTypeSerializer; +import jakarta.json.bind.config.PropertyOrderStrategy; import jakarta.json.bind.serializer.DeserializationContext; import jakarta.json.bind.serializer.JsonbDeserializer; import jakarta.json.bind.serializer.JsonbSerializer; @@ -36,8 +37,12 @@ import static org.junit.Assert.assertTrue; * This test checks a JsonbSerialize/JsonbDeserialize roundtrip when using a primitive as placeholder */ public class SerialiseAsPrimitiveTest { - - + + @Rule + public final JsonbRule jsonb = new JsonbRule() + .withPropertyOrderStrategy(PropertyOrderStrategy.LEXICOGRAPHICAL); + + public static class TestConstant { public final static TestConstant VAL_1 = new TestConstant("A"); public final static TestConstant VAL_2 = new TestConstant("B"); @@ -120,8 +125,7 @@ public class SerialiseAsPrimitiveTest { ConstantUsage enumVerwender = new ConstantUsage(); enumVerwender.setI(1); enumVerwender.setTestConstant(TestConstant.VAL_2); - - Jsonb jsonb = JsonbBuilder.create(); + final String json = jsonb.toJson(enumVerwender); assertTrue(json.contains("\"testConstant\":\"B\"")); } diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java index 267a5327..827d4661 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java @@ -94,6 +94,8 @@ public class Mapper implements Closeable { writeObject(ArrayUtil.asList((float[]) object), stream); } else if (object instanceof double[]) { writeObject(ArrayUtil.asList((double[]) object), stream); + } else if (object instanceof boolean[]) { + writeObject(ArrayUtil.asList((boolean[]) object), stream); } else { writeObject(Arrays.asList((T[]) object), stream); } diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java index d117a87d..faeb8287 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java @@ -110,7 +110,7 @@ public class MapperTest { } @Test - public void mapToJsonArray() { + public void mapToJsonArrayIntPrimitive() { int[] anArray = new int[]{3, 4, 5}; final JsonValue structure = new MapperBuilder().build().toStructure(anArray); assertEquals(JsonValue.ValueType.ARRAY, structure.getValueType()); @@ -118,6 +118,15 @@ public class MapperTest { assertEquals("[3,4,5]", jsonArray.toString()); } + @Test + public void mapToJsonArrayLongPrimitive() { + long[] anArray = new long[]{3, 4, 5}; + final JsonValue structure = new MapperBuilder().build().toStructure(anArray); + assertEquals(JsonValue.ValueType.ARRAY, structure.getValueType()); + final JsonArray jsonArray = structure.asJsonArray(); + assertEquals("[3,4,5]", jsonArray.toString()); + } + @Test public void mapToJsonList() { List<Integer> anList = asList(3,4,5);
