Do not peek during a "skipValue" if a value has already been peeked.

This commit is contained in:
Joel Leitch 2013-01-14 18:38:46 +00:00
parent 3f2efac95e
commit 84201c015f
2 changed files with 54 additions and 1 deletions

View File

@ -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++;

View File

@ -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}"));