import java.io.IOException;\r
import java.io.InputStream;\r
import java.io.Reader;\r
-import java.util.LinkedList;\r
\r
import org.antlr.runtime.ANTLRInputStream;\r
import org.antlr.runtime.ANTLRReaderStream;\r
import org.antlr.runtime.ANTLRStringStream;\r
+import org.antlr.runtime.CharStream;\r
import org.antlr.runtime.Token;\r
import org.xerial.json.impl.JSONLexer;\r
+import org.xerial.util.ArrayDeque;\r
import org.xerial.util.log.Logger;\r
\r
/**\r
}\r
\r
private static Logger _logger = Logger.getLogger(JSONPullParser.class);\r
- private JSONLexer _lexer;\r
- private LinkedList<ParseState> parseStateStack = new LinkedList<ParseState>();\r
+ private JSONLexer _lexer = new JSONLexer();\r
+\r
+ private ArrayDeque<ParseState> parseStateStack = new ArrayDeque<ParseState>();\r
+ private ArrayDeque<String> keyStack = new ArrayDeque<String>();\r
+\r
private JSONPullParserEvent lastReportedEvent = null;\r
- private LinkedList<String> keyStack = new LinkedList<String>();\r
private int currentDepth = 0;\r
\r
public JSONPullParser(String jsonString)\r
{\r
- this(new JSONLexer(new ANTLRStringStream(jsonString)));\r
+ reset(jsonString);\r
}\r
\r
public JSONPullParser(JSONObject jsonObject)\r
{\r
- this(new JSONLexer(new ANTLRStringStream(jsonObject.toJSONString())));\r
+ reset(jsonObject);\r
}\r
\r
public JSONPullParser(InputStream jsonStream) throws IOException\r
{\r
- this(new JSONLexer(new ANTLRInputStream(jsonStream)));\r
+ reset(jsonStream);\r
}\r
\r
public JSONPullParser(Reader reader) throws IOException\r
{\r
- this(new JSONLexer(new ANTLRReaderStream(reader)));\r
+ reset(reader);\r
+ }\r
+\r
+ public void reset(String jsonString)\r
+ {\r
+ reset(new ANTLRStringStream(jsonString));\r
}\r
\r
- protected JSONPullParser(JSONLexer lexer)\r
+ public void reset(JSONObject jsonObject)\r
{\r
- _lexer = lexer;\r
+ reset(new ANTLRStringStream(jsonObject.toJSONString()));\r
+ }\r
+\r
+ public void reset(InputStream jsonStream) throws IOException\r
+ {\r
+ reset(new ANTLRInputStream(jsonStream));\r
+ }\r
+\r
+ public void reset(Reader reader) throws IOException\r
+ {\r
+ reset(new ANTLRReaderStream(reader));\r
+ }\r
+\r
+ private void reset(CharStream newStream)\r
+ {\r
+ _lexer.reset();\r
+ _lexer.setCharStream(newStream);\r
+\r
+ parseStateStack.clear();\r
+ keyStack.clear();\r
+\r
+ lastReportedEvent = null;\r
+ currentDepth = 0;\r
+\r
parseStateStack.addLast(ParseState.Root);\r
}\r
\r
// _logger.trace("pop : " + StringUtil.join(parseStateStack, ", "));\r
}\r
\r
- private void keyedValueTest()\r
+ private void valueWithKeyTest()\r
{\r
if (getCurrentParseState() == ParseState.Key)\r
pushParseState(ParseState.KeyedValue);\r
switch (tokenType)\r
{\r
case JSONLexer.LBrace:\r
- keyedValueTest();\r
+ valueWithKeyTest();\r
currentDepth++;\r
pushParseState(ParseState.InObject);\r
return reportEvent(token, JSONEvent.StartObject);\r
popKeyStack();\r
return reportEvent(token, JSONEvent.EndObject);\r
case JSONLexer.LBracket:\r
- keyedValueTest();\r
+ valueWithKeyTest();\r
currentDepth++;\r
pushParseState(ParseState.InArray);\r
return reportEvent(token, JSONEvent.StartArray);\r
keyStack.addLast(removeDoubleQuotation(token.getText()));\r
continue;\r
}\r
- keyedValueTest();\r
+ valueWithKeyTest();\r
return reportEvent(token, JSONEvent.String);\r
case JSONLexer.Integer:\r
- keyedValueTest();\r
+ valueWithKeyTest();\r
return reportEvent(token, JSONEvent.Integer);\r
case JSONLexer.Double:\r
- keyedValueTest();\r
+ valueWithKeyTest();\r
return reportEvent(token, JSONEvent.Double);\r
case JSONLexer.TRUE:\r
case JSONLexer.FALSE:\r
- keyedValueTest();\r
+ valueWithKeyTest();\r
return reportEvent(token, JSONEvent.Boolean);\r
case JSONLexer.NULL:\r
- keyedValueTest();\r
+ valueWithKeyTest();\r
return reportEvent(token, JSONEvent.Null);\r
}\r
}\r