From d6c8c1e3cf6749258e3f98d2bc03c973385e31a7 Mon Sep 17 00:00:00 2001 From: Jesse Wilson Date: Tue, 11 Nov 2014 01:59:48 +0000 Subject: [PATCH] Fix bugs in getPath() with arrays of objects and arrays of arrays --- .../com/google/gson/stream/JsonReader.java | 2 + .../gson/stream/JsonReaderPathTest.java | 48 +++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) 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()); + } }