From: leo Date: Mon, 1 Jun 2009 08:26:08 +0000 (+0000) Subject: JSONPullParser X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=23a03e71ee2ce6ff37439a83c8c40bbebf8c5bb7;p=xerial%2Fxerial-core.git JSONPullParser git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3346 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd --- diff --git a/src/main/java/org/xerial/json/JSONPullParser.java b/src/main/java/org/xerial/json/JSONPullParser.java index 13e8623..d9e9bd8 100644 --- a/src/main/java/org/xerial/json/JSONPullParser.java +++ b/src/main/java/org/xerial/json/JSONPullParser.java @@ -27,13 +27,14 @@ package org.xerial.json; import java.io.IOException; import java.io.InputStream; import java.io.Reader; -import java.util.LinkedList; import org.antlr.runtime.ANTLRInputStream; import org.antlr.runtime.ANTLRReaderStream; import org.antlr.runtime.ANTLRStringStream; +import org.antlr.runtime.CharStream; import org.antlr.runtime.Token; import org.xerial.json.impl.JSONLexer; +import org.xerial.util.ArrayDeque; import org.xerial.util.log.Logger; /** @@ -49,35 +50,65 @@ public class JSONPullParser } private static Logger _logger = Logger.getLogger(JSONPullParser.class); - private JSONLexer _lexer; - private LinkedList parseStateStack = new LinkedList(); + private JSONLexer _lexer = new JSONLexer(); + + private ArrayDeque parseStateStack = new ArrayDeque(); + private ArrayDeque keyStack = new ArrayDeque(); + private JSONPullParserEvent lastReportedEvent = null; - private LinkedList keyStack = new LinkedList(); private int currentDepth = 0; public JSONPullParser(String jsonString) { - this(new JSONLexer(new ANTLRStringStream(jsonString))); + reset(jsonString); } public JSONPullParser(JSONObject jsonObject) { - this(new JSONLexer(new ANTLRStringStream(jsonObject.toJSONString()))); + reset(jsonObject); } public JSONPullParser(InputStream jsonStream) throws IOException { - this(new JSONLexer(new ANTLRInputStream(jsonStream))); + reset(jsonStream); } public JSONPullParser(Reader reader) throws IOException { - this(new JSONLexer(new ANTLRReaderStream(reader))); + reset(reader); + } + + public void reset(String jsonString) + { + reset(new ANTLRStringStream(jsonString)); } - protected JSONPullParser(JSONLexer lexer) + public void reset(JSONObject jsonObject) { - _lexer = lexer; + reset(new ANTLRStringStream(jsonObject.toJSONString())); + } + + public void reset(InputStream jsonStream) throws IOException + { + reset(new ANTLRInputStream(jsonStream)); + } + + public void reset(Reader reader) throws IOException + { + reset(new ANTLRReaderStream(reader)); + } + + private void reset(CharStream newStream) + { + _lexer.reset(); + _lexer.setCharStream(newStream); + + parseStateStack.clear(); + keyStack.clear(); + + lastReportedEvent = null; + currentDepth = 0; + parseStateStack.addLast(ParseState.Root); } @@ -116,7 +147,7 @@ public class JSONPullParser // _logger.trace("pop : " + StringUtil.join(parseStateStack, ", ")); } - private void keyedValueTest() + private void valueWithKeyTest() { if (getCurrentParseState() == ParseState.Key) pushParseState(ParseState.KeyedValue); @@ -259,7 +290,7 @@ public class JSONPullParser switch (tokenType) { case JSONLexer.LBrace: - keyedValueTest(); + valueWithKeyTest(); currentDepth++; pushParseState(ParseState.InObject); return reportEvent(token, JSONEvent.StartObject); @@ -270,7 +301,7 @@ public class JSONPullParser popKeyStack(); return reportEvent(token, JSONEvent.EndObject); case JSONLexer.LBracket: - keyedValueTest(); + valueWithKeyTest(); currentDepth++; pushParseState(ParseState.InArray); return reportEvent(token, JSONEvent.StartArray); @@ -295,20 +326,20 @@ public class JSONPullParser keyStack.addLast(removeDoubleQuotation(token.getText())); continue; } - keyedValueTest(); + valueWithKeyTest(); return reportEvent(token, JSONEvent.String); case JSONLexer.Integer: - keyedValueTest(); + valueWithKeyTest(); return reportEvent(token, JSONEvent.Integer); case JSONLexer.Double: - keyedValueTest(); + valueWithKeyTest(); return reportEvent(token, JSONEvent.Double); case JSONLexer.TRUE: case JSONLexer.FALSE: - keyedValueTest(); + valueWithKeyTest(); return reportEvent(token, JSONEvent.Boolean); case JSONLexer.NULL: - keyedValueTest(); + valueWithKeyTest(); return reportEvent(token, JSONEvent.Null); } } diff --git a/src/test/java/org/xerial/json/JSONStreamReaderTest.java b/src/test/java/org/xerial/json/JSONStreamReaderTest.java index 4564011..b9485a5 100644 --- a/src/test/java/org/xerial/json/JSONStreamReaderTest.java +++ b/src/test/java/org/xerial/json/JSONStreamReaderTest.java @@ -26,8 +26,6 @@ package org.xerial.json; import static org.junit.Assert.*; -import java.io.StringReader; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -111,12 +109,13 @@ public class JSONStreamReaderTest StopWatch timer = new StopWatch(); + JSONPullParser parser = new JSONPullParser(json); for (int n = 0; n < 500; n++) { - JSONStreamReader reader = new JSONStreamReader(new StringReader(json)); + parser.reset(json); - TreeEvent e; - while ((e = reader.next()) != null) + JSONEvent e; + while ((e = parser.next()) != JSONEvent.EndJSON) {} }