From 780000b0a3e777a1c806a19c054a2092779e1d4c Mon Sep 17 00:00:00 2001 From: Vasiliy Mikhailov Date: Wed, 24 Jun 2026 23:20:39 +0300 Subject: [PATCH] Return null from getIntArray/getStringArray/getLongArray for a non-array property These methods call gson JsonObject.getAsJsonArray(memberName), which casts the member to JsonArray and throws ClassCastException when the property exists but is not an array (e.g. a string or number). Pass the raw element to the null-safe getAsJsonArray(JsonElement) helper and make that helper treat a non-array element like null, so the methods return null for a non-array property just as they already do for a missing one. Adds regression tests. --- .../weixin/common/util/json/GsonHelper.java | 8 +++--- .../common/util/json/GsonHelperTest.java | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java index 0d807402ac..84ebffe72f 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java @@ -108,7 +108,7 @@ public static float getAsPrimitiveFloat(JsonElement element) { } public static Integer[] getIntArray(JsonObject o, String string) { - JsonArray jsonArray = getAsJsonArray(o.getAsJsonArray(string)); + JsonArray jsonArray = getAsJsonArray(o.get(string)); if (jsonArray == null) { return null; } @@ -122,7 +122,7 @@ public static Integer[] getIntArray(JsonObject o, String string) { } public static String[] getStringArray(JsonObject o, String string) { - JsonArray jsonArray = getAsJsonArray(o.getAsJsonArray(string)); + JsonArray jsonArray = getAsJsonArray(o.get(string)); if (jsonArray == null) { return null; } @@ -136,7 +136,7 @@ public static String[] getStringArray(JsonObject o, String string) { } public static Long[] getLongArray(JsonObject o, String string) { - JsonArray jsonArray = getAsJsonArray(o.getAsJsonArray(string)); + JsonArray jsonArray = getAsJsonArray(o.get(string)); if (jsonArray == null) { return null; } @@ -150,7 +150,7 @@ public static Long[] getLongArray(JsonObject o, String string) { } public static JsonArray getAsJsonArray(JsonElement element) { - return element == null ? null : element.getAsJsonArray(); + return (element == null || !element.isJsonArray()) ? null : element.getAsJsonArray(); } /** diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/GsonHelperTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/GsonHelperTest.java index bafe3c30d1..775ac2207b 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/GsonHelperTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/GsonHelperTest.java @@ -136,4 +136,29 @@ public void testBuildSimpleJsonObject() { System.out.println(GsonHelper.buildJsonObject(1, true, "jsonElement", new JsonObject())); System.out.println(GsonHelper.buildJsonObject("num", 2, "string", "cde", "char", 'a', "bool", true)); } + + /** + * If the JSON property exists but is NOT a JSON array (e.g. a plain string), + * getIntArray should return null gracefully rather than throwing ClassCastException. + */ + @Test + public void testGetIntArrayNonArrayProperty() { + JsonObject json = new JsonObject(); + json.addProperty("items", "not-an-array"); + assertThat(GsonHelper.getIntArray(json, "items")).isNull(); + } + + @Test + public void testGetStringArrayNonArrayProperty() { + JsonObject json = new JsonObject(); + json.addProperty("items", 123); + assertThat(GsonHelper.getStringArray(json, "items")).isNull(); + } + + @Test + public void testGetLongArrayNonArrayProperty() { + JsonObject json = new JsonObject(); + json.addProperty("items", "not-an-array"); + assertThat(GsonHelper.getLongArray(json, "items")).isNull(); + } }