This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch johnzon-1.2.x
in repository https://gitbox.apache.org/repos/asf/johnzon.git

commit e0c90d0eecf3cee9c9731df63e368284cc1c0e7a
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.
---
 .../org/apache/johnzon/jsonb/JohnzonJsonb.java     |  2 +-
 .../org/apache/johnzon/jsonb/JohnzonJsonbTest.java | 21 +++++++++++++
 .../jsonb/serializer/SerialiseAsPrimitiveTest.java | 34 ++++++++++++----------
 .../java/org/apache/johnzon/mapper/Mapper.java     |  2 ++
 .../java/org/apache/johnzon/mapper/MapperTest.java | 11 ++++++-
 5 files changed, 53 insertions(+), 17 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 69c48166..474343e8 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 01e790d4..7f0d2318 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 df744992..6dc37bcd 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 javax.json.bind.Jsonb;
-import javax.json.bind.JsonbBuilder;
 import javax.json.bind.annotation.JsonbTypeDeserializer;
 import javax.json.bind.annotation.JsonbTypeSerializer;
+import javax.json.bind.config.PropertyOrderStrategy;
 import javax.json.bind.serializer.DeserializationContext;
 import javax.json.bind.serializer.JsonbDeserializer;
 import javax.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");
@@ -100,28 +105,27 @@ public class SerialiseAsPrimitiveTest {
 
     public static class ConstantJsonbDeserializer implements 
JsonbDeserializer<TestConstant> {
 
-    @Override
-    public TestConstant deserialize(JsonParser parser, DeserializationContext 
ctx, Type rtType) {
-        if (rtType instanceof TestConstant) {
-            final String key = parser.getString();
-            if (key != null) {
-                return TestConstant.getByCode(key);
+        @Override
+        public TestConstant deserialize(JsonParser parser, 
DeserializationContext ctx, Type rtType) {
+            if (rtType instanceof TestConstant) {
+                final String key = parser.getString();
+                if (key != null) {
+                    return TestConstant.getByCode(key);
+                }
             }
+
+            return null;
         }
-        
-        return null;
     }
-}
 
 
 
     @Test
-    public void testEnumJsonb() {
+    public void testEnumJsonb() throws Exception {
         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 aaded0ed..23f40ef0 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 58b0b2b0..60b3c6c9 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