diff --git a/gson/src/main/java/com/google/gson/stream/JsonReader.java b/gson/src/main/java/com/google/gson/stream/JsonReader.java index 68554f5e..388f30b0 100644 --- a/gson/src/main/java/com/google/gson/stream/JsonReader.java +++ b/gson/src/main/java/com/google/gson/stream/JsonReader.java @@ -363,6 +363,7 @@ public class JsonReader implements Closeable { } if (p == PEEKED_END_ARRAY) { stackSize--; + pathIndices[stackSize - 1]++; peeked = PEEKED_NONE; } else { throw new IllegalStateException("Expected END_ARRAY but was " + peek() @@ -400,6 +401,7 @@ public class JsonReader implements Closeable { if (p == PEEKED_END_OBJECT) { stackSize--; pathNames[stackSize] = null; // Free the last path name so that it can be garbage collected! + pathIndices[stackSize - 1]++; peeked = PEEKED_NONE; } else { throw new IllegalStateException("Expected END_OBJECT but was " + peek() diff --git a/gson/src/test/java/com/google/gson/stream/JsonReaderPathTest.java b/gson/src/test/java/com/google/gson/stream/JsonReaderPathTest.java index fe8c9ed0..537696f9 100644 --- a/gson/src/test/java/com/google/gson/stream/JsonReaderPathTest.java +++ b/gson/src/test/java/com/google/gson/stream/JsonReaderPathTest.java @@ -48,13 +48,13 @@ public class JsonReaderPathTest extends TestCase { reader.nextString(); assertEquals("$.a[5].c", reader.getPath()); reader.endObject(); - assertEquals("$.a[5]", reader.getPath()); + assertEquals("$.a[6]", reader.getPath()); reader.beginArray(); - assertEquals("$.a[5][0]", reader.getPath()); + assertEquals("$.a[6][0]", reader.getPath()); reader.nextInt(); - assertEquals("$.a[5][1]", reader.getPath()); + assertEquals("$.a[6][1]", reader.getPath()); reader.endArray(); - assertEquals("$.a[5]", reader.getPath()); + assertEquals("$.a[7]", reader.getPath()); reader.endArray(); assertEquals("$.a", reader.getPath()); reader.endObject(); @@ -173,4 +173,44 @@ public class JsonReaderPathTest extends TestCase { reader.skipValue(); assertEquals("$[1]", reader.getPath()); } + + public void testArrayOfObjects() throws IOException { + JsonReader reader = new JsonReader(new StringReader("[{},{},{}]")); + reader.beginArray(); + assertEquals("$[0]", reader.getPath()); + reader.beginObject(); + assertEquals("$[0].", reader.getPath()); + reader.endObject(); + assertEquals("$[1]", reader.getPath()); + reader.beginObject(); + assertEquals("$[1].", reader.getPath()); + reader.endObject(); + assertEquals("$[2]", reader.getPath()); + reader.beginObject(); + assertEquals("$[2].", reader.getPath()); + reader.endObject(); + assertEquals("$[3]", reader.getPath()); + reader.endArray(); + assertEquals("$", reader.getPath()); + } + + public void testArrayOfArrays() throws IOException { + JsonReader reader = new JsonReader(new StringReader("[[],[],[]]")); + reader.beginArray(); + assertEquals("$[0]", reader.getPath()); + reader.beginArray(); + assertEquals("$[0][0]", reader.getPath()); + reader.endArray(); + assertEquals("$[1]", reader.getPath()); + reader.beginArray(); + assertEquals("$[1][0]", reader.getPath()); + reader.endArray(); + assertEquals("$[2]", reader.getPath()); + reader.beginArray(); + assertEquals("$[2][0]", reader.getPath()); + reader.endArray(); + assertEquals("$[3]", reader.getPath()); + reader.endArray(); + assertEquals("$", reader.getPath()); + } }