diff --git a/src/main/java/com/alibaba/fastjson/JSONReader.java b/src/main/java/com/alibaba/fastjson/JSONReader.java new file mode 100644 index 000000000..b0cb5ca01 --- /dev/null +++ b/src/main/java/com/alibaba/fastjson/JSONReader.java @@ -0,0 +1,275 @@ +package com.alibaba.fastjson; + +import java.io.Closeable; +import java.io.Reader; +import java.lang.reflect.Type; +import java.util.Map; + +import com.alibaba.fastjson.parser.DefaultJSONParser; +import com.alibaba.fastjson.parser.Feature; +import com.alibaba.fastjson.parser.JSONLexer; +import com.alibaba.fastjson.parser.JSONReaderScanner; +import com.alibaba.fastjson.parser.JSONToken; +import com.alibaba.fastjson.util.TypeUtils; + +public class JSONReader implements Closeable { + + private final DefaultJSONParser parser; + private JSONStreamContext context; + + public JSONReader(Reader reader){ + this(new DefaultJSONParser(new JSONReaderScanner(reader))); + } + + public JSONReader(JSONLexer lexer){ + this(new DefaultJSONParser(lexer)); + } + + public JSONReader(DefaultJSONParser parser){ + this.parser = parser; + } + + public void config(Feature feature, boolean state) { + this.parser.config(feature, state); + } + + public void startObject() { + if (context == null) { + context = new JSONStreamContext(null, JSONStreamState.BeginObject); + } else { + if (context.getState() == JSONStreamState.PropertyKey) { + parser.accept(JSONToken.COLON); + } else if (context.getState() == JSONStreamState.ArrayValue) { + parser.accept(JSONToken.COMMA); + } else if (context.getState() == JSONStreamState.BeginObject) { + // skip + } else if (context.getState() == JSONStreamState.BeginArray) { + // skip + } else { + throw new JSONException("illegal state : " + context.getState()); + } + context = new JSONStreamContext(context, JSONStreamState.BeginObject); + } + + this.parser.accept(JSONToken.LBRACE, JSONToken.IDENTIFIER); + } + + public void endObject() { + this.parser.accept(JSONToken.RBRACE); + endStructure(); + } + + public void startArray() { + if (context == null) { + context = new JSONStreamContext(null, JSONStreamState.BeginArray); + } else { + if (context.getState() == JSONStreamState.PropertyKey) { + parser.accept(JSONToken.COLON); + } else if (context.getState() == JSONStreamState.ArrayValue) { + parser.accept(JSONToken.COMMA); + } else if (context.getState() == JSONStreamState.BeginArray) { + // skipe + } else { + throw new JSONException("illegal state : " + context.getState()); + } + context = new JSONStreamContext(context, JSONStreamState.BeginArray); + } + this.parser.accept(JSONToken.LBRACKET); + } + + public void endArray() { + this.parser.accept(JSONToken.RBRACKET); + endStructure(); + } + + private void endStructure() { + context = context.getParent(); + + if (context == null) { + // skip + } else if (context.getState() == JSONStreamState.PropertyKey) { + context.setState(JSONStreamState.PropertyValue); + } else if (context.getState() == JSONStreamState.BeginArray) { + context.setState(JSONStreamState.ArrayValue); + } else if (context.getState() == JSONStreamState.ArrayValue) { + // skip + } + } + + public boolean hasNext() { + if (context == null) { + throw new JSONException("context is null"); + } + + final int token = parser.getLexer().token(); + final JSONStreamState state = context.getState(); + switch (state) { + case BeginArray: + case ArrayValue: + return token != JSONToken.RBRACKET; + case BeginObject: + case PropertyValue: + return token != JSONToken.RBRACE; + default: + throw new JSONException("illegal state : " + state); + } + } + + public void close() { + parser.close(); + } + + public Integer readInteger() { + Object object; + if (context == null) { + object = parser.parse(); + } else { + readBefore(); + object = parser.parse(); + readAfter(); + } + + return TypeUtils.castToInt(object); + } + + public Long readLong() { + Object object; + if (context == null) { + object = parser.parse(); + } else { + readBefore(); + object = parser.parse(); + readAfter(); + } + + return TypeUtils.castToLong(object); + } + + public String readString() { + Object object; + if (context == null) { + object = parser.parse(); + } else { + readBefore(); + object = parser.parse(); + readAfter(); + } + + return TypeUtils.castToString(object); + } + + public T readObject(Type type) { + if (context == null) { + return parser.parseObject(type); + } + + readBefore(); + T object = parser.parseObject(type); + readAfter(); + return object; + } + + public T readObject(Class type) { + if (context == null) { + return parser.parseObject(type); + } + + readBefore(); + T object = parser.parseObject(type); + readAfter(); + return object; + } + + public void readObject(Object object) { + if (context == null) { + parser.parseObject(object); + return; + } + + readBefore(); + parser.parseObject(object); + readAfter(); + } + + public Object readObject() { + if (context == null) { + return parser.parse(); + } + + readBefore(); + Object object; + switch (context.getState()) { + case BeginObject: + case PropertyValue: + object = parser.parseKey(); + break; + default: + object = parser.parse(); + break; + } + + readAfter(); + return object; + } + + @SuppressWarnings("rawtypes") + public Object readObject(Map object) { + if (context == null) { + return parser.parseObject(object); + } + + readBefore(); + Object value = parser.parseObject(object); + readAfter(); + return value; + } + + private void readBefore() { + JSONStreamState state = context.getState(); + // before + switch (state) { + case PropertyKey: + parser.accept(JSONToken.COLON); + break; + case PropertyValue: + parser.accept(JSONToken.COMMA, JSONToken.IDENTIFIER); + break; + case ArrayValue: + parser.accept(JSONToken.COMMA); + break; + case BeginObject: + break; + case BeginArray: + break; + default: + throw new JSONException("illegal state : " + state); + } + } + + private void readAfter() { + JSONStreamState state = context.getState(); + JSONStreamState newStat = null; + switch (state) { + case BeginObject: + newStat = JSONStreamState.PropertyKey; + break; + case PropertyKey: + newStat = JSONStreamState.PropertyValue; + break; + case PropertyValue: + newStat = JSONStreamState.PropertyKey; + break; + case ArrayValue: + break; + case BeginArray: + newStat = JSONStreamState.ArrayValue; + break; + default: + throw new JSONException("illegal state : " + state); + } + if (newStat != null) { + context.setState(newStat); + } + } + +} diff --git a/src/main/java/com/alibaba/fastjson/JSONStreamContext.java b/src/main/java/com/alibaba/fastjson/JSONStreamContext.java new file mode 100644 index 000000000..e5de3ae0f --- /dev/null +++ b/src/main/java/com/alibaba/fastjson/JSONStreamContext.java @@ -0,0 +1,25 @@ +package com.alibaba.fastjson; + +class JSONStreamContext { + + private final JSONStreamContext parent; + + private JSONStreamState state; + + public JSONStreamContext(JSONStreamContext parent, JSONStreamState state){ + this.parent = parent; + this.state = state; + } + + public JSONStreamContext getParent() { + return parent; + } + + public JSONStreamState getState() { + return state; + } + + public void setState(JSONStreamState state) { + this.state = state; + } +} diff --git a/src/main/java/com/alibaba/fastjson/JSONStreamState.java b/src/main/java/com/alibaba/fastjson/JSONStreamState.java new file mode 100644 index 000000000..ffb01182e --- /dev/null +++ b/src/main/java/com/alibaba/fastjson/JSONStreamState.java @@ -0,0 +1,9 @@ +package com.alibaba.fastjson; + +enum JSONStreamState { + BeginObject, // + PropertyKey, // + PropertyValue, // + BeginArray, // + ArrayValue +} diff --git a/src/main/java/com/alibaba/fastjson/JSONWriter.java b/src/main/java/com/alibaba/fastjson/JSONWriter.java index 47b2060e0..858d1d127 100755 --- a/src/main/java/com/alibaba/fastjson/JSONWriter.java +++ b/src/main/java/com/alibaba/fastjson/JSONWriter.java @@ -8,45 +8,12 @@ import com.alibaba.fastjson.serializer.SerializeWriter; public class JSONWriter { - private SerializeWriter writer; - private final Writer out; + private SerializeWriter writer; + private final Writer out; - private JSONSerializer serializer; + private JSONSerializer serializer; - private Context context; - - public static enum State { - BeginObject, // - PropertyKey, // - PropertyValue, // - BeginArray, // - ArrayValue - } - - public static class Context { - - private final Context parent; - - private State state; - - public Context(Context parent, State state){ - this.parent = parent; - this.state = state; - } - - public Context getParent() { - return parent; - } - - public State getState() { - return state; - } - - public void setState(State state) { - this.state = state; - } - - } + private JSONStreamContext context; public JSONWriter(Writer out){ this.out = out; @@ -68,20 +35,20 @@ public class JSONWriter { public void writeStartObject() { if (context == null) { - context = new Context(null, State.BeginObject); + context = new JSONStreamContext(null, JSONStreamState.BeginObject); } else { - if (context.getState() == State.PropertyKey) { + if (context.getState() == JSONStreamState.PropertyKey) { writer.write(':'); - } else if (context.getState() == State.ArrayValue) { + } else if (context.getState() == JSONStreamState.ArrayValue) { writer.write(','); - } else if (context.getState() == State.BeginObject) { + } else if (context.getState() == JSONStreamState.BeginObject) { // skip - } else if (context.getState() == State.BeginArray) { + } else if (context.getState() == JSONStreamState.BeginArray) { // skip } else { throw new JSONException("illegal state : " + context.getState()); } - context = new Context(context, State.BeginObject); + context = new JSONStreamContext(context, JSONStreamState.BeginObject); } writer.write('{'); } @@ -91,45 +58,53 @@ public class JSONWriter { context = context.getParent(); if (context == null) { // skip - } else if (context.getState() == State.PropertyKey) { - context.setState(State.PropertyValue); - } else if (context.getState() == State.BeginArray) { - context.setState(State.ArrayValue); - } else if (context.getState() == State.ArrayValue) { + } else if (context.getState() == JSONStreamState.PropertyKey) { + context.setState(JSONStreamState.PropertyValue); + } else if (context.getState() == JSONStreamState.BeginArray) { + context.setState(JSONStreamState.ArrayValue); + } else if (context.getState() == JSONStreamState.ArrayValue) { // skip } } public void writeKey(String key) { - if (context.getState() == State.PropertyValue) { + if (context.getState() == JSONStreamState.PropertyValue) { writer.write(','); } writer.writeString(key); - context.setState(State.PropertyKey); + context.setState(JSONStreamState.PropertyKey); } public void writeValue(Object object) { - if (context.getState() == State.PropertyKey) { - writer.write(':'); + switch (context.getState()) { + case PropertyKey: + writer.write(':'); + break; + case ArrayValue: + writer.write(','); + break; + default: + break; } + serializer.write(object); - context.setState(State.PropertyValue); + context.setState(JSONStreamState.PropertyValue); } public void writeStartArray() { if (context == null) { - context = new Context(null, State.BeginArray); + context = new JSONStreamContext(null, JSONStreamState.BeginArray); } else { - if (context.getState() == State.PropertyKey) { + if (context.getState() == JSONStreamState.PropertyKey) { writer.write(':'); - } else if (context.getState() == State.ArrayValue) { + } else if (context.getState() == JSONStreamState.ArrayValue) { writer.write(','); - } else if (context.getState() == State.BeginArray) { + } else if (context.getState() == JSONStreamState.BeginArray) { // skipe } else { throw new JSONException("illegal state : " + context.getState()); } - context = new Context(context, State.BeginArray); + context = new JSONStreamContext(context, JSONStreamState.BeginArray); } writer.write('['); } @@ -140,11 +115,11 @@ public class JSONWriter { if (context == null) { // skip - } else if (context.getState() == State.PropertyKey) { - context.setState(State.PropertyValue); - } else if (context.getState() == State.BeginArray) { - context.setState(State.ArrayValue); - } else if (context.getState() == State.ArrayValue) { + } else if (context.getState() == JSONStreamState.PropertyKey) { + context.setState(JSONStreamState.PropertyValue); + } else if (context.getState() == JSONStreamState.BeginArray) { + context.setState(JSONStreamState.ArrayValue); + } else if (context.getState() == JSONStreamState.ArrayValue) { // skip } } diff --git a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java index 535555734..2d75fee1e 100755 --- a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java +++ b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java @@ -1041,6 +1041,15 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable { public Object parse() { return parse(null); } + + public Object parseKey() { + if (lexer.token() == JSONToken.IDENTIFIER) { + String value = lexer.stringVal(); + lexer.nextToken(JSONToken.COMMA); + return value; + } + return parse(null); + } public Object parse(Object fieldName) { final JSONLexer lexer = getLexer(); @@ -1142,6 +1151,16 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable { + JSONToken.name(lexer.token())); } } + + public final void accept(final int token, int nextExpectToken) { + final JSONLexer lexer = getLexer(); + if (lexer.token() == token) { + lexer.nextToken(nextExpectToken); + } else { + throw new JSONException("syntax error, expect " + JSONToken.name(token) + ", actual " + + JSONToken.name(lexer.token())); + } + } public void close() { final JSONLexer lexer = getLexer(); diff --git a/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java b/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java index f17787a5c..14b749f11 100755 --- a/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java +++ b/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java @@ -326,6 +326,9 @@ public abstract class JSONLexer implements Closeable { return; } break; + case JSONToken.IDENTIFIER: + nextIdent(); + return; default: break; } @@ -339,6 +342,17 @@ public abstract class JSONLexer implements Closeable { break; } } + + public final void nextIdent() { + while (isWhitespace(ch)) { + next(); + } + if (ch == '_' || Character.isLetter(ch)) { + scanIdent(); + } else { + nextToken(); + } + } public final void nextTokenWithColon() { sp = 0; diff --git a/src/main/java/com/alibaba/fastjson/parser/JSONReaderScanner.java b/src/main/java/com/alibaba/fastjson/parser/JSONReaderScanner.java index 8c9ff18cd..b62f933bd 100644 --- a/src/main/java/com/alibaba/fastjson/parser/JSONReaderScanner.java +++ b/src/main/java/com/alibaba/fastjson/parser/JSONReaderScanner.java @@ -730,7 +730,7 @@ public final class JSONReaderScanner extends JSONLexer { @Override public boolean isEOF() { - return bp == buf.length || ch == EOI && bp + 1 == buf.length; + return bufLength == -1 || bp == buf.length || ch == EOI && bp + 1 == buf.length; } public final boolean isRef() { diff --git a/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_array.java b/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_array.java new file mode 100644 index 000000000..0ef1e2e7a --- /dev/null +++ b/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_array.java @@ -0,0 +1,47 @@ +package com.alibaba.fastjson; + +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.parser.JSONScanner; + +public class JSONReaderTest_array_array extends TestCase { + + String text = "[[],[],[],[],[], [],[],[],[],[]]"; + + public void test_read() throws Exception { + + JSONReader reader = new JSONReader(new StringReader(text)); + reader.startArray(); + + int count = 0; + while (reader.hasNext()) { + Object item = reader.readObject(); + Assert.assertEquals(JSONArray.class, item.getClass()); + count++; + } + Assert.assertEquals(10, count); + + reader.endArray(); + reader.close(); + } + + public void test_read_1() throws Exception { + JSONReader reader = new JSONReader(new JSONScanner(text)); + reader.startArray(); + + int count = 0; + while (reader.hasNext()) { + Object item = reader.readObject(); + Assert.assertEquals(JSONArray.class, item.getClass()); + count++; + } + Assert.assertEquals(10, count); + + reader.endArray(); + reader.close(); + } +} diff --git a/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_array_2.java b/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_array_2.java new file mode 100644 index 000000000..381bbb631 --- /dev/null +++ b/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_array_2.java @@ -0,0 +1,47 @@ +package com.alibaba.fastjson; + +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.parser.JSONScanner; + +public class JSONReaderTest_array_array_2 extends TestCase { + + String text = "[[],[],[],[],[], [],[],[],[],[]]"; + + public void test_read() throws Exception { + + JSONReader reader = new JSONReader(new StringReader(text)); + reader.startArray(); + + int count = 0; + while (reader.hasNext()) { + reader.startArray(); + reader.endArray(); + count++; + } + Assert.assertEquals(10, count); + + reader.endArray(); + reader.close(); + } + + public void test_read_1() throws Exception { + JSONReader reader = new JSONReader(new JSONScanner(text)); + reader.startArray(); + + int count = 0; + while (reader.hasNext()) { + reader.startArray(); + reader.endArray(); + count++; + } + Assert.assertEquals(10, count); + + reader.endArray(); + reader.close(); + } +} diff --git a/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_object.java b/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_object.java new file mode 100644 index 000000000..226631bee --- /dev/null +++ b/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_object.java @@ -0,0 +1,45 @@ +package com.alibaba.fastjson; + +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.parser.JSONScanner; + +public class JSONReaderTest_array_object extends TestCase { + + String text = "[{},{},{},{},{} ,{},{},{},{},{}]"; + + public void test_read() throws Exception { + + JSONReader reader = new JSONReader(new StringReader(text)); + reader.startArray(); + + int count = 0; + while (reader.hasNext()) { + reader.readObject(); + count++; + } + Assert.assertEquals(10, count); + + reader.endArray(); + reader.close(); + } + + public void test_read_1() throws Exception { + JSONReader reader = new JSONReader(new JSONScanner(text)); + reader.startArray(); + + int count = 0; + while (reader.hasNext()) { + reader.readObject(); + count++; + } + Assert.assertEquals(10, count); + + reader.endArray(); + reader.close(); + } +} diff --git a/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_object_2.java b/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_object_2.java new file mode 100644 index 000000000..19e2c75f3 --- /dev/null +++ b/src/test/java/com/alibaba/fastjson/JSONReaderTest_array_object_2.java @@ -0,0 +1,47 @@ +package com.alibaba.fastjson; + +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.parser.JSONScanner; + +public class JSONReaderTest_array_object_2 extends TestCase { + + String text = "[{},{},{},{},{} ,{},{},{},{},{}]"; + + public void test_read() throws Exception { + + JSONReader reader = new JSONReader(new StringReader(text)); + reader.startArray(); + + int count = 0; + while (reader.hasNext()) { + reader.startObject(); + reader.endObject(); + count++; + } + Assert.assertEquals(10, count); + + reader.endArray(); + reader.close(); + } + + public void test_read_1() throws Exception { + JSONReader reader = new JSONReader(new JSONScanner(text)); + reader.startArray(); + + int count = 0; + while (reader.hasNext()) { + reader.startObject(); + reader.endObject(); + count++; + } + Assert.assertEquals(10, count); + + reader.endArray(); + reader.close(); + } +} diff --git a/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_int.java b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_int.java new file mode 100644 index 000000000..5fc4b3216 --- /dev/null +++ b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_int.java @@ -0,0 +1,46 @@ +package com.alibaba.fastjson; + +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.parser.JSONScanner; + +public class JSONReaderTest_object_int extends TestCase { + + public void test_read() throws Exception { + String text = "{\"f0\":0,\"f1\":1,\"f2\":2,\"f3\":3,\"f4\":4, " + // + "\"f5\":5,\"f6\":6,\"f7\":7,\"f8\":8,\"f9\":9}"; + JSONReader reader = new JSONReader(new StringReader(text)); + reader.startObject(); + + int count = 0; + while (reader.hasNext()) { + String key = (String) reader.readObject(); + Integer value = reader.readInteger(); + count++; + } + Assert.assertEquals(10, count); + + reader.endObject(); + reader.close(); + } + + public void test_read_1() throws Exception { + String text = "[{},{},{},{},{} ,{},{},{},{},{}]"; + JSONReader reader = new JSONReader(new JSONScanner(text)); + reader.startArray(); + + int count = 0; + while (reader.hasNext()) { + reader.readObject(); + count++; + } + Assert.assertEquals(10, count); + + reader.endArray(); + reader.close(); + } +} diff --git a/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_int_unquote.java b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_int_unquote.java new file mode 100644 index 000000000..0ebc871c9 --- /dev/null +++ b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_int_unquote.java @@ -0,0 +1,49 @@ +package com.alibaba.fastjson; + +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.parser.Feature; +import com.alibaba.fastjson.parser.JSONScanner; + +public class JSONReaderTest_object_int_unquote extends TestCase { + + String text = "{f0:0,f1:1,f2:2,f3:3,f4:4, " + // + "f5:5,f6:6,f7:7,f8:8,f9:9}"; + + public void test_read() throws Exception { + + JSONReader reader = new JSONReader(new StringReader(text)); + reader.startObject(); + + int count = 0; + while (reader.hasNext()) { + String key = (String) reader.readObject(); + Integer value = reader.readInteger(); + count++; + } + Assert.assertEquals(10, count); + + reader.endObject(); + reader.close(); + } + + public void test_read_1() throws Exception { + JSONReader reader = new JSONReader(new JSONScanner(text)); + reader.startObject(); + + int count = 0; + while (reader.hasNext()) { + String key = (String) reader.readObject(); + Integer value = reader.readInteger(); + count++; + } + Assert.assertEquals(10, count); + + reader.endObject(); + reader.close(); + } +} diff --git a/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_long.java b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_long.java new file mode 100644 index 000000000..c14a730b2 --- /dev/null +++ b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_long.java @@ -0,0 +1,50 @@ +package com.alibaba.fastjson; + +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.parser.JSONScanner; + +public class JSONReaderTest_object_long extends TestCase { + + String text = "{\"f0\":0,\"f1\":1,\"f2\":2,\"f3\":3,\"f4\":4, " + // + "\"f5\":5,\"f6\":6,\"f7\":7,\"f8\":8,\"f9\":9}"; + + public void test_read() throws Exception { + + JSONReader reader = new JSONReader(new StringReader(text)); + + reader.startObject(); + + int count = 0; + while (reader.hasNext()) { + String key = (String) reader.readObject(); + Long value = reader.readLong(); + count++; + } + Assert.assertEquals(10, count); + + reader.endObject(); + reader.close(); + } + + public void test_read_1() throws Exception { + JSONReader reader = new JSONReader(new JSONScanner(text)); + + reader.startObject(); + + int count = 0; + while (reader.hasNext()) { + String key = (String) reader.readObject(); + Long value = reader.readLong(); + count++; + } + Assert.assertEquals(10, count); + + reader.endObject(); + reader.close(); + } +} diff --git a/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_object.java b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_object.java new file mode 100644 index 000000000..e05af43dc --- /dev/null +++ b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_object.java @@ -0,0 +1,48 @@ +package com.alibaba.fastjson; + +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.parser.JSONScanner; + +public class JSONReaderTest_object_object extends TestCase { + + String text = "{\"f0\":{},\"f1\":{},\"f2\":{},\"f3\":{},\"f4\":{}, " + // + "\"f5\":{},\"f6\":{},\"f7\":{},\"f8\":{},\"f9\":{}}"; + + public void test_read() throws Exception { + + JSONReader reader = new JSONReader(new StringReader(text)); + reader.startObject(); + + int count = 0; + while (reader.hasNext()) { + String key = (String) reader.readObject(); + Object value = reader.readObject(); + count++; + } + Assert.assertEquals(10, count); + + reader.endObject(); + reader.close(); + } + + public void test_read_1() throws Exception { + JSONReader reader = new JSONReader(new JSONScanner(text)); + reader.startObject(); + + int count = 0; + while (reader.hasNext()) { + String key = (String) reader.readObject(); + Object value = reader.readObject(); + count++; + } + Assert.assertEquals(10, count); + + reader.endObject(); + reader.close(); + } +} diff --git a/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_string.java b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_string.java new file mode 100644 index 000000000..d527e93cd --- /dev/null +++ b/src/test/java/com/alibaba/fastjson/JSONReaderTest_object_string.java @@ -0,0 +1,50 @@ +package com.alibaba.fastjson; + +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.parser.JSONScanner; + +public class JSONReaderTest_object_string extends TestCase { + + String text = "{\"f0\":\"0\",\"f1\":\"1\",\"f2\":\"2\",\"f3\":\"3\",\"f4\":\"4\", " + // + "\"f5\":\"5\",\"f6\":\"6\",\"f7\":\"7\",\"f8\":\"8\",\"f9\":\"9\"}"; + + public void test_read() throws Exception { + + JSONReader reader = new JSONReader(new StringReader(text)); + + reader.startObject(); + + int count = 0; + while (reader.hasNext()) { + String key = (String) reader.readObject(); + String value = reader.readString(); + count++; + } + Assert.assertEquals(10, count); + + reader.endObject(); + reader.close(); + } + + public void test_read_1() throws Exception { + JSONReader reader = new JSONReader(new JSONScanner(text)); + + reader.startObject(); + + int count = 0; + while (reader.hasNext()) { + String key = (String) reader.readObject(); + Long value = reader.readLong(); + count++; + } + Assert.assertEquals(10, count); + + reader.endObject(); + reader.close(); + } +} diff --git a/src/test/java/com/alibaba/json/bvt/JSONWriterTest.java b/src/test/java/com/alibaba/json/bvt/JSONWriterTest.java index 1fad5129c..62b3c1bfe 100755 --- a/src/test/java/com/alibaba/json/bvt/JSONWriterTest.java +++ b/src/test/java/com/alibaba/json/bvt/JSONWriterTest.java @@ -105,12 +105,14 @@ public class JSONWriterTest extends TestCase { writer.writeEndArray(); writer.writeEndArray(); + + writer.writeValue(1); } writer.writeEndArray(); writer.flush(); - Assert.assertEquals("[{},{},[],[[],[]]]", out.toString()); + Assert.assertEquals("[{},{},[],[[],[]],1]", out.toString()); } }