From 71bd8df49bd44d6d4630f9763364ce360cd9337b Mon Sep 17 00:00:00 2001 From: jdymitarai Date: Fri, 11 Sep 2026 22:14:12 +0800 Subject: [PATCH] Throw JsonSyntaxException for null element in primitive array --- .../gson/internal/bind/ArrayTypeAdapter.java | 8 +++ .../com/google/gson/functional/ArrayTest.java | 53 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java b/gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java index 50efa418c0..664a767a1a 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java +++ b/gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java @@ -17,6 +17,7 @@ package com.google.gson.internal.bind; import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; import com.google.gson.TypeAdapter; import com.google.gson.TypeAdapterFactory; import com.google.gson.internal.GsonTypes; @@ -73,6 +74,13 @@ public Object read(JsonReader in) throws IOException { in.beginArray(); while (in.hasNext()) { E instance = componentTypeAdapter.read(in); + if (componentType.isPrimitive() && instance == null) { + throw new JsonSyntaxException( + "null is not a valid " + + componentType.getName() + + "[] element; at path " + + in.getPreviousPath()); + } list.add(instance); } in.endArray(); diff --git a/gson/src/test/java/com/google/gson/functional/ArrayTest.java b/gson/src/test/java/com/google/gson/functional/ArrayTest.java index b8a4e3a069..3939f2a52f 100644 --- a/gson/src/test/java/com/google/gson/functional/ArrayTest.java +++ b/gson/src/test/java/com/google/gson/functional/ArrayTest.java @@ -22,6 +22,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; +import com.google.gson.JsonSyntaxException; import com.google.gson.common.TestTypes.BagOfPrimitives; import com.google.gson.common.TestTypes.ClassWithObjects; import com.google.gson.reflect.TypeToken; @@ -101,6 +102,58 @@ public void testNullsInArrayDeserialization() { assertThat(target).asList().containsAnyIn(expected); } + @Test + public void testNullsInPrimitiveArrayDeserialization() { + var e = assertThrows(JsonSyntaxException.class, () -> gson.fromJson("[1,null,3]", int[].class)); + assertThat(e).hasMessageThat().isEqualTo("null is not a valid int[] element; at path $[1]"); + + e = + assertThrows( + JsonSyntaxException.class, () -> gson.fromJson("[true,null,false]", boolean[].class)); + assertThat(e).hasMessageThat().isEqualTo("null is not a valid boolean[] element; at path $[1]"); + + e = + assertThrows( + JsonSyntaxException.class, () -> gson.fromJson("[1.0,null,2.0]", double[].class)); + assertThat(e).hasMessageThat().isEqualTo("null is not a valid double[] element; at path $[1]"); + + e = assertThrows(JsonSyntaxException.class, () -> gson.fromJson("[1,null,2]", long[].class)); + assertThat(e).hasMessageThat().isEqualTo("null is not a valid long[] element; at path $[1]"); + + e = + assertThrows( + JsonSyntaxException.class, () -> gson.fromJson("['a',null,'b']", char[].class)); + assertThat(e).hasMessageThat().isEqualTo("null is not a valid char[] element; at path $[1]"); + + e = assertThrows(JsonSyntaxException.class, () -> gson.fromJson("[1,null,2]", byte[].class)); + assertThat(e).hasMessageThat().isEqualTo("null is not a valid byte[] element; at path $[1]"); + + e = assertThrows(JsonSyntaxException.class, () -> gson.fromJson("[1,null,2]", short[].class)); + assertThat(e).hasMessageThat().isEqualTo("null is not a valid short[] element; at path $[1]"); + + e = + assertThrows( + JsonSyntaxException.class, () -> gson.fromJson("[1.0,null,2.0]", float[].class)); + assertThat(e).hasMessageThat().isEqualTo("null is not a valid float[] element; at path $[1]"); + + // Multidimensional array: null inner element + e = + assertThrows( + JsonSyntaxException.class, () -> gson.fromJson("[[1,null],[2,3]]", int[][].class)); + assertThat(e).hasMessageThat().isEqualTo("null is not a valid int[] element; at path $[0][1]"); + } + + @Test + public void testNullsInBoxedAndMultidimensionalArray() { + Integer[] boxed = gson.fromJson("[1,null,3]", Integer[].class); + assertThat(boxed).asList().containsExactly(1, null, 3).inOrder(); + + int[][] multi = gson.fromJson("[[1,2],null]", int[][].class); + assertThat(multi).hasLength(2); + assertThat(multi[0]).isEqualTo(new int[] {1, 2}); + assertThat(multi[1]).isNull(); + } + @Test public void testSingleNullInArraySerialization() { BagOfPrimitives[] array = new BagOfPrimitives[1];