diff --git a/analytics/src/main/java/com/segment/analytics/Cartographer.java b/analytics/src/main/java/com/segment/analytics/Cartographer.java index 1c5b6206f..77c93d6f7 100644 --- a/analytics/src/main/java/com/segment/analytics/Cartographer.java +++ b/analytics/src/main/java/com/segment/analytics/Cartographer.java @@ -32,6 +32,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -190,11 +191,15 @@ private static void listToWriter(List list, JsonWriter writer) throws IOExcep writer.endArray(); } - /** Print the json representation of an array to the given writer. */ - private static void arrayToWriter(Object[] array, JsonWriter writer) throws IOException { + /** + * Print the json representation of an array to the given writer. Primitive arrays cannot be cast + * to Object[], to this method accepts the raw object and uses {@link Array#getLength(Object)} and + * {@link Array#get(Object, int)} to read the array. + */ + private static void arrayToWriter(Object array, JsonWriter writer) throws IOException { writer.beginArray(); - for (Object value : array) { - writeValue(value, writer); + for (int i = 0, size = Array.getLength(array); i < size; i++) { + writeValue(Array.get(array, i), writer); } writer.endArray(); } @@ -216,7 +221,7 @@ private static void writeValue(Object value, JsonWriter writer) throws IOExcepti } else if (value instanceof Map) { mapToWriter((Map) value, writer); } else if (value.getClass().isArray()) { - arrayToWriter((Object[]) value, writer); + arrayToWriter(value, writer); } else { writer.value(String.valueOf(value)); } diff --git a/analytics/src/test/java/com/segment/analytics/CartographerTest.java b/analytics/src/test/java/com/segment/analytics/CartographerTest.java index b05c93fce..4e0765b49 100644 --- a/analytics/src/test/java/com/segment/analytics/CartographerTest.java +++ b/analytics/src/test/java/com/segment/analytics/CartographerTest.java @@ -245,6 +245,17 @@ public void encodesArraysWithArrays() throws IOException { + "}"); } + @Test + public void encodesPrimitiveArrays() throws IOException { + // Exercise a bug where primitive arrays would throw an IOException. + // https://github.com/segmentio/analytics-android/issues/507 + Map map = + ImmutableMap.builder().put("a", new int[] {1, 2}).build(); + + assertThat(cartographer.toJson(map)) + .isEqualTo("{\n" + " \"a\": [\n" + " 1,\n" + " 2\n" + " ]\n" + "}"); + } + @Test public void decodesArraysWithArraysAsLists() throws IOException { String json =