diff --git a/json/src/main/java/tech/tablesaw/io/json/JsonReader.java b/json/src/main/java/tech/tablesaw/io/json/JsonReader.java index fad26ed5f..a17164c2f 100644 --- a/json/src/main/java/tech/tablesaw/io/json/JsonReader.java +++ b/json/src/main/java/tech/tablesaw/io/json/JsonReader.java @@ -101,7 +101,11 @@ private Table convertArrayOfObjects(JsonNode jsonObj, ReadOptions options) throw for (JsonNode node : flattenedJsonObj) { String[] arr = new String[columnNames.size()]; for (int i = 0; i < columnNames.size(); i++) { - arr[i] = node.get(columnNames.get(i)).asText(); + if(node.has(columnNames.get(i))) { + arr[i] = node.get(columnNames.get(i)).asText(); + } else { + arr[i] = null; + } } dataRows.add(arr); } diff --git a/json/src/test/java/tech/tablesaw/io/json/JsonReaderTest.java b/json/src/test/java/tech/tablesaw/io/json/JsonReaderTest.java index e75cc4f78..041e753b7 100644 --- a/json/src/test/java/tech/tablesaw/io/json/JsonReaderTest.java +++ b/json/src/test/java/tech/tablesaw/io/json/JsonReaderTest.java @@ -18,6 +18,7 @@ import org.junit.jupiter.api.Test; import tech.tablesaw.api.ColumnType; +import tech.tablesaw.api.IntColumn; import tech.tablesaw.api.Table; public class JsonReaderTest { @@ -32,6 +33,7 @@ public void arrayOfArraysWithHeader() { assertEquals("Date", table.column(0).name()); assertEquals("Value", table.column(1).name()); assertEquals(ColumnType.LONG, table.columnTypes()[0]); + assertEquals(1453438800000L, table.column("Date").get(0)); } @Test @@ -55,4 +57,25 @@ public void arrayOfNestedObjects() { assertEquals("b.c", table.column(1).name()); assertEquals(ColumnType.LONG, table.columnTypes()[0]); } + + @Test + public void arrayOfRowsWithIncompleteIndexes() { + String json = "[" + + "{\"A\" : \"123\", \"B\" : \"456\"}," + + "{\"B\" : \"789\", \"C\" : \"123\"}" + + "]"; + + Table expected = Table.create( + IntColumn.create("A", new int[]{123, Integer.MIN_VALUE}), + IntColumn.create("B", new int[]{456, 789}), + IntColumn.create("C", new int[]{Integer.MIN_VALUE, 123}) + ); + Table actual = Table.read().string(json, "json"); + + assertEquals(ColumnType.INTEGER, actual.columnTypes()[0]); + assertEquals(expected.column("A").asList(), actual.column("A").asList()); + assertEquals(expected.column("B").asList(), actual.column("B").asList()); + assertEquals(expected.column("C").asList(), actual.column("C").asList()); + } + }