Made JsonParser implement Iterator
This commit is contained in:
parent
41a1f8b89e
commit
f4f596ec3d
|
@ -18,18 +18,21 @@ package com.google.gson;
|
|||
import java.io.EOFException;
|
||||
import java.io.Reader;
|
||||
import java.io.StringReader;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* A parser that allows reading of multiple {@link JsonElement}s from the specified reader
|
||||
* asynchronously.
|
||||
* asynchronously. This class is not thread-safe.
|
||||
*
|
||||
* @author Inderjeet Singh
|
||||
* @author Joel Leitch
|
||||
* @since 1.4
|
||||
*/
|
||||
public final class JsonParserAsync {
|
||||
public final class JsonParserAsync implements Iterator<JsonElement> {
|
||||
|
||||
private final JsonParserJavacc parser;
|
||||
private boolean eof;
|
||||
private JsonElement nextElement;
|
||||
|
||||
/**
|
||||
* @param json The string containing JSON elements concatenated to each other.
|
||||
|
@ -45,6 +48,8 @@ public final class JsonParserAsync {
|
|||
*/
|
||||
public JsonParserAsync(Reader reader) {
|
||||
parser = new JsonParserJavacc(reader);
|
||||
eof = false;
|
||||
nextElement = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -54,7 +59,15 @@ public final class JsonParserAsync {
|
|||
* @throws JsonParseException if the incoming stream is malformed JSON.
|
||||
* @since 1.4
|
||||
*/
|
||||
public JsonElement nextElement() throws JsonParseException {
|
||||
public JsonElement next() throws JsonParseException {
|
||||
if (eof) {
|
||||
return null;
|
||||
}
|
||||
if (nextElement != null) {
|
||||
JsonElement returnValue = nextElement;
|
||||
nextElement = null;
|
||||
return returnValue;
|
||||
}
|
||||
try {
|
||||
JsonElement element = parser.parse();
|
||||
return element;
|
||||
|
@ -68,10 +81,20 @@ public final class JsonParserAsync {
|
|||
throw new JsonParseException("Failed parsing JSON source to Json", e);
|
||||
} catch (JsonParseException e) {
|
||||
if (e.getCause() instanceof EOFException) {
|
||||
eof = true;
|
||||
return null;
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
nextElement = next();
|
||||
return nextElement != null;
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package com.google.gson;
|
||||
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
|
@ -11,9 +14,18 @@ public class JsonParserAsyncTest extends TestCase {
|
|||
|
||||
public void testParseTwoStrings() {
|
||||
JsonParserAsync parser = new JsonParserAsync("'one' 'two'");
|
||||
String actualOne = parser.nextElement().getAsString();
|
||||
String actualOne = parser.next().getAsString();
|
||||
assertEquals("one", actualOne);
|
||||
String actualTwo = parser.nextElement().getAsString();
|
||||
String actualTwo = parser.next().getAsString();
|
||||
assertEquals("two", actualTwo);
|
||||
}
|
||||
|
||||
public void testIterator() {
|
||||
Iterator<JsonElement> parser = new JsonParserAsync("'one' 'two'");
|
||||
assertTrue(parser.hasNext());
|
||||
assertEquals("one", parser.next().getAsString());
|
||||
assertTrue(parser.hasNext());
|
||||
assertEquals("two", parser.next().getAsString());
|
||||
assertFalse(parser.hasNext());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -93,9 +93,9 @@ public class ReadersWritersTest extends TestCase {
|
|||
writer.write(gson.toJson("two").toCharArray());
|
||||
CharArrayReader reader = new CharArrayReader(writer.toCharArray());
|
||||
JsonParserAsync parser = new JsonParserAsync(reader);
|
||||
String actualOne = gson.fromJson(parser.nextElement(), String.class);
|
||||
String actualOne = gson.fromJson(parser.next(), String.class);
|
||||
assertEquals("one", actualOne);
|
||||
String actualTwo = gson.fromJson(parser.nextElement(), String.class);
|
||||
String actualTwo = gson.fromJson(parser.next(), String.class);
|
||||
assertEquals("two", actualTwo);
|
||||
}
|
||||
|
||||
|
@ -108,10 +108,11 @@ public class ReadersWritersTest extends TestCase {
|
|||
writer.write(gson.toJson(expectedTwo).toCharArray());
|
||||
CharArrayReader reader = new CharArrayReader(writer.toCharArray());
|
||||
JsonParserAsync parser = new JsonParserAsync(reader);
|
||||
BagOfPrimitives actualOne = gson.fromJson(parser.nextElement(), BagOfPrimitives.class);
|
||||
BagOfPrimitives actualOne = gson.fromJson(parser.next(), BagOfPrimitives.class);
|
||||
assertEquals("one", actualOne.stringValue);
|
||||
BagOfPrimitives actualTwo = gson.fromJson(parser.nextElement(), BagOfPrimitives.class);
|
||||
BagOfPrimitives actualTwo = gson.fromJson(parser.next(), BagOfPrimitives.class);
|
||||
assertEquals("two", actualTwo.stringValue);
|
||||
JsonElement jsonElement = parser.nextElement();
|
||||
JsonElement jsonElement = parser.next();
|
||||
assertNull(jsonElement);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user