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 50f50ec5..2cc4b124 100644 --- a/gson/src/main/java/com/google/gson/stream/JsonReader.java +++ b/gson/src/main/java/com/google/gson/stream/JsonReader.java @@ -1225,7 +1225,11 @@ public class JsonReader implements Closeable { public void skipValue() throws IOException { int count = 0; do { - int p = doPeek(); + int p = peeked; + if (p == PEEKED_NONE) { + p = doPeek(); + } + if (p == PEEKED_BEGIN_ARRAY) { push(JsonScope.EMPTY_ARRAY); count++; diff --git a/gson/src/test/java/com/google/gson/stream/JsonReaderTest.java b/gson/src/test/java/com/google/gson/stream/JsonReaderTest.java index cb2376da..dd7bb574 100644 --- a/gson/src/test/java/com/google/gson/stream/JsonReaderTest.java +++ b/gson/src/test/java/com/google/gson/stream/JsonReaderTest.java @@ -71,6 +71,38 @@ public final class JsonReaderTest extends TestCase { assertEquals(JsonToken.END_DOCUMENT, reader.peek()); } + public void testSkipArray() throws IOException { + JsonReader reader = new JsonReader(reader( + "{\"a\": [\"one\", \"two\", \"three\"], \"b\": 123}")); + reader.beginObject(); + assertEquals("a", reader.nextName()); + reader.skipValue(); + assertEquals("b", reader.nextName()); + assertEquals(123, reader.nextInt()); + reader.endObject(); + assertEquals(JsonToken.END_DOCUMENT, reader.peek()); + } + + public void testSkipArrayAfterPeek() throws Exception { + JsonReader reader = new JsonReader(reader( + "{\"a\": [\"one\", \"two\", \"three\"], \"b\": 123}")); + reader.beginObject(); + assertEquals("a", reader.nextName()); + assertEquals(BEGIN_ARRAY, reader.peek()); + reader.skipValue(); + assertEquals("b", reader.nextName()); + assertEquals(123, reader.nextInt()); + reader.endObject(); + assertEquals(JsonToken.END_DOCUMENT, reader.peek()); + } + + public void testSkipTopLevelObject() throws Exception { + JsonReader reader = new JsonReader(reader( + "{\"a\": [\"one\", \"two\", \"three\"], \"b\": 123}")); + reader.skipValue(); + assertEquals(JsonToken.END_DOCUMENT, reader.peek()); + } + public void testSkipObject() throws IOException { JsonReader reader = new JsonReader(reader( "{\"a\": { \"c\": [], \"d\": [true, true, {}] }, \"b\": \"banana\"}")); @@ -83,6 +115,23 @@ public final class JsonReaderTest extends TestCase { assertEquals(JsonToken.END_DOCUMENT, reader.peek()); } + public void testSkipObjectAfterPeek() throws Exception { + String json = "{" + " \"one\": { \"num\": 1 }" + + ", \"two\": { \"num\": 2 }" + ", \"three\": { \"num\": 3 }" + "}"; + JsonReader reader = new JsonReader(reader(json)); + reader.beginObject(); + assertEquals("one", reader.nextName()); + assertEquals(BEGIN_OBJECT, reader.peek()); + reader.skipValue(); + assertEquals("two", reader.nextName()); + assertEquals(BEGIN_OBJECT, reader.peek()); + reader.skipValue(); + assertEquals("three", reader.nextName()); + reader.skipValue(); + reader.endObject(); + assertEquals(JsonToken.END_DOCUMENT, reader.peek()); + } + public void testSkipInteger() throws IOException { JsonReader reader = new JsonReader(reader( "{\"a\":123456789,\"b\":-123456789}"));