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);

Reply via email to