aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjoel.leitch@gmail.com <joel.leitch@gmail.com@2534bb62-2c4b-0410-85e8-b5006b95c4ae>2013-01-14 18:38:46 +0000
committerjoel.leitch@gmail.com <joel.leitch@gmail.com@2534bb62-2c4b-0410-85e8-b5006b95c4ae>2013-01-14 18:38:46 +0000
commit22d573ca50015bbb62dca24159911f0822d9e7b9 (patch)
tree1bb288093f99ad913e7df3e6799b3084b99b1ffe
parent8b3b867a6c425112a477aa87efa19aab01df2c54 (diff)
downloadandroid_external_gson-22d573ca50015bbb62dca24159911f0822d9e7b9.tar.gz
android_external_gson-22d573ca50015bbb62dca24159911f0822d9e7b9.tar.bz2
android_external_gson-22d573ca50015bbb62dca24159911f0822d9e7b9.zip
Do not peek during a "skipValue" if a value has already been peeked.
git-svn-id: http://google-gson.googlecode.com/svn/trunk/gson@1221 2534bb62-2c4b-0410-85e8-b5006b95c4ae
-rw-r--r--src/main/java/com/google/gson/stream/JsonReader.java6
-rw-r--r--src/test/java/com/google/gson/stream/JsonReaderTest.java49
2 files changed, 54 insertions, 1 deletions
diff --git a/src/main/java/com/google/gson/stream/JsonReader.java b/src/main/java/com/google/gson/stream/JsonReader.java
index 50f50ec5..2cc4b124 100644
--- a/src/main/java/com/google/gson/stream/JsonReader.java
+++ b/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/src/test/java/com/google/gson/stream/JsonReaderTest.java b/src/test/java/com/google/gson/stream/JsonReaderTest.java
index cb2376da..dd7bb574 100644
--- a/src/test/java/com/google/gson/stream/JsonReaderTest.java
+++ b/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}"));