From 5bbb3f75cab8b79eb2fd66eefc9c9118538c0e30 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 14 Feb 2017 17:14:50 +0800 Subject: [PATCH] 1.2.7 --- pom.xml | 2 +- src/main/java/com/alibaba/fastjson/JSON.java | 15 +- .../com/alibaba/fastjson/asm/Opcodes.java | 4 +- .../alibaba/fastjson/parser/JSONScanner.java | 226 +++++++++++------- .../alibaba/fastjson/parser/ParserConfig.java | 29 ++- .../deserializer/ASMDeserializerFactory.java | 25 +- .../deserializer/JavaBeanDeserializer.java | 44 +++- .../serializer/ASMSerializerFactory.java | 4 +- .../fastjson/serializer/MapSerializer.java | 25 +- .../fastjson/serializer/MiscCodec.java | 57 +++-- .../fastjson/serializer/SerializeConfig.java | 18 +- .../serializer/SerializerFeature.java | 7 +- .../com/alibaba/fastjson/util/FieldInfo.java | 6 +- .../com/alibaba/fastjson/util/IOUtils.java | 7 +- .../com/alibaba/fastjson/util/TypeUtils.java | 3 + src/test/java/ArrayTest.java | 12 + .../com/alibaba/json/bvt/CurrencyTest4.java | 40 ++++ .../alibaba/json/bvt/bug/Bug_for_xujin.java | 98 ++++++++ .../alibaba/json/bvt/bug/Bug_for_xujin2.java | 128 ++++++++++ .../json/bvt/bug/Bug_for_xujin_int.java | 82 +++++++ .../com/alibaba/json/bvt/bug/Issue1017.java | 33 +++ .../bvt/parser/autoType/AutoTypeTest0.java | 22 ++ .../bvt/parser/autoType/AutoTypeTest1.java | 28 +++ .../json/bvt/parser/deser/DupTest.java | 20 ++ .../parser/deser/FieldDeserializerTest10.java | 29 +++ .../parser/deser/FieldDeserializerTest4.java | 2 + .../parser/deser/FieldDeserializerTest5.java | 4 + .../parser/deser/FieldDeserializerTest6.java | 2 + .../parser/deser/FieldDeserializerTest7.java | 2 + .../parser/deser/FieldDeserializerTest8.java | 2 + .../parser/deser/FieldDeserializerTest9.java | 32 +++ .../serializer/GenericTypeNotMatchTest.java | 26 ++ .../serializer/GenericTypeNotMatchTest2.java | 37 +++ .../json/bvt/serializer/GenericTypeTest2.java | 2 +- .../serializer/features/MapSortFieldTest.java | 22 ++ .../{ => typeRef}/TypeReferenceTest10.java | 2 +- .../{ => typeRef}/TypeReferenceTest11.java | 2 +- .../{ => typeRef}/TypeReferenceTest12.java | 2 +- .../json/bvt/typeRef/TypeReferenceTest13.java | 88 +++++++ .../writeClassName/WriteClassNameTest.java | 3 +- .../alibaba/json/bvtVO/AuditStatusType.java | 51 ++++ .../json/bvtVO/ContactTemplateParam.java | 38 +++ .../java/com/alibaba/json/bvtVO/IntEnum.java | 8 + .../com/alibaba/json/demo/ReuseObject.java | 35 +++ .../json/test/JsonIteratorByteArrayTest.java | 57 +++++ .../json/test/codegen/DepartmentCodec.java | 2 +- src/test/java/data/media/ImageGenDecoder.java | 2 +- .../data/media/MediaContentGenDecoder.java | 2 +- src/test/java/data/media/MediaGenDecoder.java | 2 +- 49 files changed, 1228 insertions(+), 161 deletions(-) create mode 100644 src/test/java/ArrayTest.java create mode 100644 src/test/java/com/alibaba/json/bvt/CurrencyTest4.java create mode 100644 src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin.java create mode 100644 src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin2.java create mode 100644 src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin_int.java create mode 100644 src/test/java/com/alibaba/json/bvt/bug/Issue1017.java create mode 100644 src/test/java/com/alibaba/json/bvt/parser/autoType/AutoTypeTest0.java create mode 100644 src/test/java/com/alibaba/json/bvt/parser/autoType/AutoTypeTest1.java create mode 100644 src/test/java/com/alibaba/json/bvt/parser/deser/DupTest.java create mode 100644 src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest10.java create mode 100644 src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest9.java create mode 100644 src/test/java/com/alibaba/json/bvt/serializer/GenericTypeNotMatchTest.java create mode 100644 src/test/java/com/alibaba/json/bvt/serializer/GenericTypeNotMatchTest2.java create mode 100644 src/test/java/com/alibaba/json/bvt/serializer/features/MapSortFieldTest.java rename src/test/java/com/alibaba/json/bvt/{ => typeRef}/TypeReferenceTest10.java (93%) rename src/test/java/com/alibaba/json/bvt/{ => typeRef}/TypeReferenceTest11.java (94%) rename src/test/java/com/alibaba/json/bvt/{ => typeRef}/TypeReferenceTest12.java (95%) create mode 100644 src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest13.java create mode 100644 src/test/java/com/alibaba/json/bvtVO/AuditStatusType.java create mode 100644 src/test/java/com/alibaba/json/bvtVO/ContactTemplateParam.java create mode 100644 src/test/java/com/alibaba/json/bvtVO/IntEnum.java create mode 100644 src/test/java/com/alibaba/json/demo/ReuseObject.java create mode 100644 src/test/java/com/alibaba/json/test/JsonIteratorByteArrayTest.java diff --git a/pom.xml b/pom.xml index 05e879ba1a..c541931b04 100755 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ --> com.alibaba fastjson - 1.2.26 + 1.2.27 jar fastjson diff --git a/src/main/java/com/alibaba/fastjson/JSON.java b/src/main/java/com/alibaba/fastjson/JSON.java index 59c7756841..9ae1ff8199 100755 --- a/src/main/java/com/alibaba/fastjson/JSON.java +++ b/src/main/java/com/alibaba/fastjson/JSON.java @@ -109,9 +109,20 @@ public abstract class JSON implements JSONStreamAware, JSONAware { features |= SerializerFeature.SkipTransientField.getMask(); features |= SerializerFeature.WriteEnumUsingName.getMask(); features |= SerializerFeature.SortField.getMask(); + + { + String featuresProperty = IOUtils.getStringProperty("fastjson.serializerFeatures.MapSortField"); + int mask = SerializerFeature.MapSortField.getMask(); + if ("true".equals(featuresProperty)) { + features |= mask; + } else if ("false".equals(featuresProperty)) { + features &= ~mask; + } + } + DEFAULT_GENERATE_FEATURE = features; } - + /** * config default type key * @since 1.2.14 @@ -964,5 +975,5 @@ public static void handleResovleTask(DefaultJSONParser parser, T value) { parser.handleResovleTask(value); } - public final static String VERSION = "1.2.26"; + public final static String VERSION = "1.2.27"; } diff --git a/src/main/java/com/alibaba/fastjson/asm/Opcodes.java b/src/main/java/com/alibaba/fastjson/asm/Opcodes.java index 79f958857f..3440da9804 100755 --- a/src/main/java/com/alibaba/fastjson/asm/Opcodes.java +++ b/src/main/java/com/alibaba/fastjson/asm/Opcodes.java @@ -39,6 +39,7 @@ * @author Eugene Kuleshov */ public interface Opcodes { + int T_INT = 10; // versions @@ -80,6 +81,7 @@ public interface Opcodes { int FSTORE = 56; // - int DSTORE = 57; // - int ASTORE = 58; // - + int IASTORE = 79; // visitInsn int POP = 87; // - // int POP2 = 88; // - @@ -123,7 +125,7 @@ public interface Opcodes { int INVOKEINTERFACE = 185; // - // int INVOKEDYNAMIC = 186; // - int NEW = 187; // visitTypeInsn - // int NEWARRAY = 188; // visitIntInsn + int NEWARRAY = 188; // visitIntInsn // int ANEWARRAY = 189; // visitTypeInsn // int ARRAYLENGTH = 190; // visitInsn // int ATHROW = 191; // - diff --git a/src/main/java/com/alibaba/fastjson/parser/JSONScanner.java b/src/main/java/com/alibaba/fastjson/parser/JSONScanner.java index 999df9317e..b843521336 100644 --- a/src/main/java/com/alibaba/fastjson/parser/JSONScanner.java +++ b/src/main/java/com/alibaba/fastjson/parser/JSONScanner.java @@ -705,8 +705,17 @@ public int scanFieldInt(char[] fieldName) { return 0; } - if (ch == ',' || ch == '}') { - bp = index - 1; + for (;;) { + if (ch == ',' || ch == '}') { + bp = index - 1; + break; + } else if(isWhitespace(ch)) { + ch = charAt(index++); + continue; + } else { + matchStat = NOT_MATCH; + return 0; + } } } else { matchStat = NOT_MATCH; @@ -721,23 +730,33 @@ public int scanFieldInt(char[] fieldName) { } if (ch == '}') { + bp = index - 1; ch = charAt(++bp); - if (ch == ',') { - token = JSONToken.COMMA; - this.ch = charAt(++bp); - } else if (ch == ']') { - token = JSONToken.RBRACKET; - this.ch = charAt(++bp); - } else if (ch == '}') { - token = JSONToken.RBRACE; - this.ch = charAt(++bp); - } else if (ch == EOI) { - token = JSONToken.EOF; - } else { - this.bp = startPos; - this.ch = startChar; - matchStat = NOT_MATCH; - return 0; + for (; ; ) { + if (ch == ',') { + token = JSONToken.COMMA; + this.ch = charAt(++bp); + break; + } else if (ch == ']') { + token = JSONToken.RBRACKET; + this.ch = charAt(++bp); + break; + } else if (ch == '}') { + token = JSONToken.RBRACE; + this.ch = charAt(++bp); + break; + } else if (ch == EOI) { + token = JSONToken.EOF; + break; + } else if (isWhitespace(ch)) { + ch = charAt(++bp); + continue; + } else { + this.bp = startPos; + this.ch = startChar; + matchStat = NOT_MATCH; + return 0; + } } matchStat = END; } @@ -797,14 +816,20 @@ public String scanFieldString(char[] fieldName) { ch = charAt(endIndex + 1); - if (ch == ',' || ch == '}') { - bp = endIndex + 1; - this.ch = ch; - strVal = stringVal; - } else { - matchStat = NOT_MATCH; + for (;;) { + if (ch == ',' || ch == '}') { + bp = endIndex + 1; + this.ch = ch; + strVal = stringVal; + break; + } else if (isWhitespace(ch)) { + endIndex++; + ch = charAt(endIndex + 1); + } else { + matchStat = NOT_MATCH; - return stringDefaultValue(); + return stringDefaultValue(); + } } } @@ -869,33 +894,39 @@ public long scanFieldSymbol(char[] fieldName) { hash *= 0x1000193; } - if (ch == ',') { - this.ch = charAt(++bp); - matchStat = VALUE; - return hash; - } else if (ch == '}') { - next(); - skipWhitespace(); - ch = getCurrent(); + for (;;) { if (ch == ',') { - token = JSONToken.COMMA; - this.ch = charAt(++bp); - } else if (ch == ']') { - token = JSONToken.RBRACKET; this.ch = charAt(++bp); + matchStat = VALUE; + return hash; } else if (ch == '}') { - token = JSONToken.RBRACE; - this.ch = charAt(++bp); - } else if (ch == EOI) { - token = JSONToken.EOF; + next(); + skipWhitespace(); + ch = getCurrent(); + if (ch == ',') { + token = JSONToken.COMMA; + this.ch = charAt(++bp); + } else if (ch == ']') { + token = JSONToken.RBRACKET; + this.ch = charAt(++bp); + } else if (ch == '}') { + token = JSONToken.RBRACE; + this.ch = charAt(++bp); + } else if (ch == EOI) { + token = JSONToken.EOF; + } else { + matchStat = NOT_MATCH; + return 0; + } + matchStat = END; + break; + } else if (isWhitespace(ch)) { + ch = charAt(++bp); + continue; } else { matchStat = NOT_MATCH; return 0; } - matchStat = END; - } else { - matchStat = NOT_MATCH; - return 0; } return hash; @@ -1102,34 +1133,49 @@ public long scanFieldLong(char[] fieldName) { return 0; } - if (ch == ',') { - this.ch = charAt(++bp); - matchStat = VALUE; - token = JSONToken.COMMA; - return negative ? -value : value; - } else if (ch == '}') { - ch = charAt(++bp); + for (;;) { if (ch == ',') { - token = JSONToken.COMMA; - this.ch = charAt(++bp); - } else if (ch == ']') { - token = JSONToken.RBRACKET; this.ch = charAt(++bp); + matchStat = VALUE; + token = JSONToken.COMMA; + return negative ? -value : value; } else if (ch == '}') { - token = JSONToken.RBRACE; - this.ch = charAt(++bp); - } else if (ch == EOI) { - token = JSONToken.EOF; + ch = charAt(++bp); + for (;;) { + if (ch == ',') { + token = JSONToken.COMMA; + this.ch = charAt(++bp); + break; + } else if (ch == ']') { + token = JSONToken.RBRACKET; + this.ch = charAt(++bp); + break; + } else if (ch == '}') { + token = JSONToken.RBRACE; + this.ch = charAt(++bp); + break; + } else if (ch == EOI) { + token = JSONToken.EOF; + break; + } else if (isWhitespace(ch)) { + ch = charAt(++bp); + } else { + this.bp = startPos; + this.ch = startChar; + matchStat = NOT_MATCH; + return 0; + } + } + matchStat = END; + break; + } else if (isWhitespace(ch)) { + bp = index; + ch = charAt(index++); + continue; } else { - this.bp = startPos; - this.ch = startChar; matchStat = NOT_MATCH; return 0; } - matchStat = END; - } else { - matchStat = NOT_MATCH; - return 0; } return negative ? -value : value; @@ -1191,31 +1237,43 @@ public boolean scanFieldBoolean(char[] fieldName) { return false; } - if (ch == ',') { - this.ch = charAt(++bp); - matchStat = VALUE; - token = JSONToken.COMMA; - } else if (ch == '}') { - ch = charAt(++bp); + for (;;) { if (ch == ',') { - token = JSONToken.COMMA; - this.ch = charAt(++bp); - } else if (ch == ']') { - token = JSONToken.RBRACKET; this.ch = charAt(++bp); + matchStat = VALUE; + token = JSONToken.COMMA; + break; } else if (ch == '}') { - token = JSONToken.RBRACE; - this.ch = charAt(++bp); - } else if (ch == EOI) { - token = JSONToken.EOF; + ch = charAt(++bp); + for (;;) { + if (ch == ',') { + token = JSONToken.COMMA; + this.ch = charAt(++bp); + } else if (ch == ']') { + token = JSONToken.RBRACKET; + this.ch = charAt(++bp); + } else if (ch == '}') { + token = JSONToken.RBRACE; + this.ch = charAt(++bp); + } else if (ch == EOI) { + token = JSONToken.EOF; + } else if (isWhitespace(ch)) { + ch = charAt(++bp); + continue; + } else { + matchStat = NOT_MATCH; + return false; + } + break; + } + matchStat = END; + break; + } else if (isWhitespace(ch)) { + ch = charAt(++bp); } else { matchStat = NOT_MATCH; return false; } - matchStat = END; - } else { - matchStat = NOT_MATCH; - return false; } return value; diff --git a/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java b/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java index 00407554d9..8380d7b920 100644 --- a/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java +++ b/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java @@ -114,13 +114,14 @@ */ public class ParserConfig { - public final static String DENY_PROPERTY = "fastjson.parser.deny"; - public final static String AUTOTYPE_ACCEPT = "fastjson.parser.autoTypeAccept"; + public final static String DENY_PROPERTY = "fastjson.parser.deny"; + public final static String AUTOTYPE_ACCEPT = "fastjson.parser.autoTypeAccept"; public final static String AUTOTYPE_SUPPORT_PROPERTY = "fastjson.parser.autoTypeSupport"; public static final String[] DENYS; private static final String[] AUTO_TYPE_ACCEPT_LIST; public static final boolean AUTO_SUPPORT; + static { { String property = IOUtils.getStringProperty(DENY_PROPERTY); @@ -144,13 +145,13 @@ public static ParserConfig getGlobalInstance() { return global; } - public static ParserConfig global = new ParserConfig(); + public static ParserConfig global = new ParserConfig(); - private final IdentityHashMap deserializers = new IdentityHashMap(); + private final IdentityHashMap deserializers = new IdentityHashMap(); - private boolean asmEnable = !ASMUtils.IS_ANDROID; + private boolean asmEnable = !ASMUtils.IS_ANDROID; - public final SymbolTable symbolTable = new SymbolTable(4096); + public final SymbolTable symbolTable = new SymbolTable(4096); public PropertyNamingStrategy propertyNamingStrategy; @@ -158,12 +159,13 @@ public static ParserConfig getGlobalInstance() { protected ASMDeserializerFactory asmFactory; - private static boolean awtError = false; - private static boolean jdk8Error = false; + private static boolean awtError = false; + private static boolean jdk8Error = false; - private boolean autoTypeSupport = AUTO_SUPPORT; - private String[] denyList = "bsh,com.mchange,com.sun.,java.lang.Thread,java.net.Socket,java.rmi,javax.xml,org.apache.bcel,org.apache.commons.beanutils,org.apache.commons.collections.Transformer,org.apache.commons.collections.functors,org.apache.commons.collections4.comparators,org.apache.commons.fileupload,org.apache.myfaces.context.servlet,org.apache.tomcat,org.apache.wicket.util,org.codehaus.groovy.runtime,org.hibernate,org.jboss,org.mozilla.javascript,org.python.core,org.springframework".split(","); - private String[] acceptList = AUTO_TYPE_ACCEPT_LIST; + private boolean autoTypeSupport = AUTO_SUPPORT; + private String[] denyList = "bsh,com.mchange,com.sun.,java.lang.Thread,java.net.Socket,java.rmi,javax.xml,org.apache.bcel,org.apache.commons.beanutils,org.apache.commons.collections.Transformer,org.apache.commons.collections.functors,org.apache.commons.collections4.comparators,org.apache.commons.fileupload,org.apache.myfaces.context.servlet,org.apache.tomcat,org.apache.wicket.util,org.codehaus.groovy.runtime,org.hibernate,org.jboss,org.mozilla.javascript,org.python.core,org.springframework".split(","); + private String[] acceptList = AUTO_TYPE_ACCEPT_LIST; + private int maxTypeNameLength = 256; public ParserConfig(){ this(null, null); @@ -806,6 +808,10 @@ public Class checkAutoType(String typeName, Class expectClass) { return null; } + if (typeName.length() >= maxTypeNameLength) { + throw new JSONException("autoType is not support. " + typeName); + } + final String className = typeName.replace('$', '.'); if (autoTypeSupport || expectClass != null) { @@ -862,7 +868,6 @@ public Class checkAutoType(String typeName, Class expectClass) { } if (clazz != null) { - if (ClassLoader.class.isAssignableFrom(clazz) // classloader is danger || DataSource.class.isAssignableFrom(clazz) // dataSource can load jdbc driver ) { diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java index 9b2a5ecf80..94fcacb76e 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java @@ -810,9 +810,30 @@ private void _deserialze(ClassWriter cw, Context context) { mw.visitVarInsn(ALOAD, 3); mw.visitVarInsn(ALOAD, context.var("instance")); mw.visitVarInsn(ILOAD, 4); + + int flagSize = (fieldListSize / 32) + 1; + if (flagSize == 1) { + mw.visitInsn(ICONST_1); + } else { + mw.visitIntInsn(BIPUSH, flagSize); + } + mw.visitIntInsn(NEWARRAY, T_INT); + for (int i = 0; i < flagSize; ++i) { + mw.visitInsn(DUP); + if (i == 0) { + mw.visitInsn(ICONST_0); + } else if (i == 1) { + mw.visitInsn(ICONST_1); + } else { + mw.visitIntInsn(BIPUSH, i); + } + mw.visitVarInsn(ILOAD, context.var("_asm_flag_" + i)); + mw.visitInsn(IASTORE); + } + mw.visitMethodInsn(INVOKEVIRTUAL, type(JavaBeanDeserializer.class), "parseRest", "(L" + DefaultJSONParser - + ";Ljava/lang/reflect/Type;Ljava/lang/Object;Ljava/lang/Object;I)Ljava/lang/Object;"); + + ";Ljava/lang/reflect/Type;Ljava/lang/Object;Ljava/lang/Object;I[I)Ljava/lang/Object;"); mw.visitTypeInsn(CHECKCAST, type(context.clazz)); // cast mw.visitInsn(ARETURN); @@ -827,7 +848,7 @@ private void _deserialze(ClassWriter cw, Context context) { "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;I)Ljava/lang/Object;"); mw.visitInsn(ARETURN); - mw.visitMaxs(6, context.variantIndex); + mw.visitMaxs(10, context.variantIndex); mw.visitEnd(); } diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java index 8edc0b9168..e0a39f1ee5 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java @@ -185,7 +185,7 @@ public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { } public T deserialze(DefaultJSONParser parser, Type type, Object fieldName, int features) { - return deserialze(parser, type, fieldName, null, features); + return deserialze(parser, type, fieldName, null, features, null); } @SuppressWarnings({ "unchecked" }) @@ -267,7 +267,8 @@ protected T deserialze(DefaultJSONParser parser, // Type type, // Object fieldName, // Object object, // - int features) { + int features, // + int[] setFlags) { if (type == JSON.class || type == JSONObject.class) { return (T) parser.parse(); } @@ -591,7 +592,7 @@ protected T deserialze(DefaultJSONParser parser, // } } } else { - boolean match = parseField(parser, key, object, type, fieldValues); + boolean match = parseField(parser, key, object, type, fieldValues, setFlags); if (!match) { if (lexer.token() == JSONToken.RBRACE) { lexer.nextToken(); @@ -710,9 +711,14 @@ protected Enum scanEnum(JSONLexerBase lexer, char[] name_chars, ObjectDeserializ return null; } } - + public boolean parseField(DefaultJSONParser parser, String key, Object object, Type objectType, Map fieldValues) { + return parseField(parser, key, object, objectType, fieldValues, null); + } + + public boolean parseField(DefaultJSONParser parser, String key, Object object, Type objectType, + Map fieldValues, int[] setFlags) { JSONLexer lexer = parser.lexer; // xxx FieldDeserializer fieldDeserializer = smartMatch(key); @@ -762,6 +768,23 @@ public boolean parseField(DefaultJSONParser parser, String key, Object object, T return false; } + int fieldIndex = -1; + for (int i = 0; i < sortedFieldDeserializers.length; ++i) { + if (sortedFieldDeserializers[i] == fieldDeserializer) { + fieldIndex = i; + break; + } + } + if (fieldIndex != -1 && setFlags != null && key.startsWith("_")) { + int flagIndex = fieldIndex / 32; + if (flagIndex < setFlags.length) { + if ((setFlags[flagIndex] & (1 << flagIndex)) != 0) { + parser.parseExtra(object, key); + return false; + } + } + } + lexer.nextTokenWithColon(fieldDeserializer.getFastMatchToken()); fieldDeserializer.parseField(parser, object, objectType, fieldValues); @@ -911,9 +934,18 @@ public Object createInstance(Map map, ParserConfig config) // public Type getFieldType(int ordinal) { return sortedFieldDeserializers[ordinal].fieldInfo.fieldType; } - + protected Object parseRest(DefaultJSONParser parser, Type type, Object fieldName, Object instance, int features) { - Object value = deserialze(parser, type, fieldName, instance, features); + return parseRest(parser, type, fieldName, instance, features, new int[0]); + } + + protected Object parseRest(DefaultJSONParser parser + , Type type + , Object fieldName + , Object instance + , int features + , int[] setFlags) { + Object value = deserialze(parser, type, fieldName, instance, features, setFlags); return value; } diff --git a/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java b/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java index 397f322b33..251b795edc 100755 --- a/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java +++ b/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java @@ -154,7 +154,7 @@ public JavaBeanSerializer createJavaBeanSerializer(SerializeBeanInfo beanInfo) t for (FieldInfo fieldInfo : getters) { if (fieldInfo.fieldClass.isPrimitive() // - || fieldInfo.fieldClass.isEnum() // + //|| fieldInfo.fieldClass.isEnum() // || fieldInfo.fieldClass == String.class) { continue; } @@ -181,7 +181,7 @@ public JavaBeanSerializer createJavaBeanSerializer(SerializeBeanInfo beanInfo) t for (int i = 0; i < getters.length; ++i) { FieldInfo fieldInfo = getters[i]; if (fieldInfo.fieldClass.isPrimitive() // - || fieldInfo.fieldClass.isEnum() // +// || fieldInfo.fieldClass.isEnum() // || fieldInfo.fieldClass == String.class) { continue; } diff --git a/src/main/java/com/alibaba/fastjson/serializer/MapSerializer.java b/src/main/java/com/alibaba/fastjson/serializer/MapSerializer.java index 2bb9480df7..23d7fcba2b 100755 --- a/src/main/java/com/alibaba/fastjson/serializer/MapSerializer.java +++ b/src/main/java/com/alibaba/fastjson/serializer/MapSerializer.java @@ -17,10 +17,7 @@ import java.io.IOException; import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -42,16 +39,16 @@ public void write(JSONSerializer serializer, Object object, Object fieldName, Ty } Map map = (Map) object; - -// if (out.isEnabled(SerializerFeature.SortField)) { -// if ((!(map instanceof SortedMap)) && !(map instanceof LinkedHashMap)) { -// try { -// map = new TreeMap(map); -// } catch (Exception ex) { -// // skip -// } -// } -// } + final int mapSortFieldMask = SerializerFeature.MapSortField.mask; + if ((out.features & mapSortFieldMask) != 0 || (features & mapSortFieldMask) != 0) { + if ((!(map instanceof SortedMap)) && !(map instanceof LinkedHashMap)) { + try { + map = new TreeMap(map); + } catch (Exception ex) { + // skip + } + } + } if (serializer.containsReference(object)) { serializer.writeReference(object); diff --git a/src/main/java/com/alibaba/fastjson/serializer/MiscCodec.java b/src/main/java/com/alibaba/fastjson/serializer/MiscCodec.java index 5f48766821..6eacf5d98c 100755 --- a/src/main/java/com/alibaba/fastjson/serializer/MiscCodec.java +++ b/src/main/java/com/alibaba/fastjson/serializer/MiscCodec.java @@ -244,8 +244,21 @@ public T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) strVal = (String) objVal; } else { if (objVal instanceof JSONObject) { + JSONObject jsonObject = (JSONObject) objVal; + + if (clazz == Currency.class) { + String currency = jsonObject.getString("currency"); + if (currency != null) { + return (T) Currency.getInstance(currency); + } + + String symbol = jsonObject.getString("symbol"); + if (symbol != null) { + return (T) Currency.getInstance(symbol); + } + } + if (clazz == Map.Entry.class) { - JSONObject jsonObject = (JSONObject) objVal; return (T) jsonObject.entrySet().iterator().next(); } } @@ -333,29 +346,35 @@ public T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) return (T) new JSONPath(strVal); } - String className = clazz.getTypeName(); - if (className.equals("java.nio.file.Path")) { - try { - if (method_paths_get == null && !method_paths_get_error) { - Class paths = TypeUtils.loadClass("java.nio.file.Paths"); - method_paths_get = paths.getMethod("get", String.class, String[].class); - } - if (method_paths_get != null) { - return (T) method_paths_get.invoke(null, strVal, new String[0]); + + if (clazz instanceof Class) { + String className = ((Class) clazz).getName(); + + if (className.equals("java.nio.file.Path")) { + try { + if (method_paths_get == null && !method_paths_get_error) { + Class paths = TypeUtils.loadClass("java.nio.file.Paths"); + method_paths_get = paths.getMethod("get", String.class, String[].class); + } + if (method_paths_get != null) { + return (T) method_paths_get.invoke(null, strVal, new String[0]); + } + + throw new JSONException("Path deserialize erorr"); + } catch (NoSuchMethodException ex) { + method_paths_get_error = true; + } catch (IllegalAccessException ex) { + throw new JSONException("Path deserialize erorr", ex); + } catch (InvocationTargetException ex) { + throw new JSONException("Path deserialize erorr", ex); } - - throw new JSONException("Path deserialize erorr"); - } catch (NoSuchMethodException ex) { - method_paths_get_error = true; - } catch (IllegalAccessException ex) { - throw new JSONException("Path deserialize erorr", ex); - } catch (InvocationTargetException ex) { - throw new JSONException("Path deserialize erorr", ex); } + + throw new JSONException("MiscCodec not support " + className); } - throw new JSONException("MiscCodec not support " + className); + throw new JSONException("MiscCodec not support " + clazz.toString()); } public int getFastMatchToken() { diff --git a/src/main/java/com/alibaba/fastjson/serializer/SerializeConfig.java b/src/main/java/com/alibaba/fastjson/serializer/SerializeConfig.java index 8c4628830f..6a0653f295 100644 --- a/src/main/java/com/alibaba/fastjson/serializer/SerializeConfig.java +++ b/src/main/java/com/alibaba/fastjson/serializer/SerializeConfig.java @@ -19,6 +19,8 @@ import java.io.Serializable; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -164,8 +166,20 @@ public ObjectSerializer createJavaBeanSerializer(SerializeBeanInfo beanInfo) { } if (asm) { - for(FieldInfo field : beanInfo.fields){ - JSONField annotation = field.getAnnotation(); + for(FieldInfo fieldInfo : beanInfo.fields){ + Field field = fieldInfo.field; + if (field != null && !field.getType().equals(fieldInfo.fieldClass)) { + asm = false; + break; + } + + Method method = fieldInfo.method; + if (method != null && !method.getReturnType().equals(fieldInfo.fieldClass)) { + asm = false; + break; + } + + JSONField annotation = fieldInfo.getAnnotation(); if (annotation == null) { continue; diff --git a/src/main/java/com/alibaba/fastjson/serializer/SerializerFeature.java b/src/main/java/com/alibaba/fastjson/serializer/SerializerFeature.java index d8704da305..d157f70ee6 100755 --- a/src/main/java/com/alibaba/fastjson/serializer/SerializerFeature.java +++ b/src/main/java/com/alibaba/fastjson/serializer/SerializerFeature.java @@ -147,7 +147,12 @@ public enum SerializerFeature { /** * @since 1.2.16 */ - WriteBigDecimalAsPlain + WriteBigDecimalAsPlain, + + /** + * @since 1.2.27 + */ + MapSortField ; SerializerFeature(){ diff --git a/src/main/java/com/alibaba/fastjson/util/FieldInfo.java b/src/main/java/com/alibaba/fastjson/util/FieldInfo.java index b58a488b59..d48f720df1 100755 --- a/src/main/java/com/alibaba/fastjson/util/FieldInfo.java +++ b/src/main/java/com/alibaba/fastjson/util/FieldInfo.java @@ -305,8 +305,10 @@ public static Type getFieldType(final Class clazz, final Type type, Type fiel if (actualTypes == null) { actualTypes = paramType.getActualTypeArguments(); } - arguments[i] = actualTypes[j]; - changed = true; + if (arguments[i] != actualTypes[j]) { + arguments[i] = actualTypes[j]; + changed = true; + } } } } diff --git a/src/main/java/com/alibaba/fastjson/util/IOUtils.java b/src/main/java/com/alibaba/fastjson/util/IOUtils.java index d78f6ca2f2..c583bf8766 100755 --- a/src/main/java/com/alibaba/fastjson/util/IOUtils.java +++ b/src/main/java/com/alibaba/fastjson/util/IOUtils.java @@ -701,7 +701,8 @@ public static int decodeUTF8(byte[] sa, int sp, int len, char[] da) { (((byte) 0xE0 << 12) ^ ((byte) 0x80 << 6) ^ ((byte) 0x80 << 0)))); - if (Character.isSurrogate(c)) { + boolean isSurrogate = c >= Character.MIN_SURROGATE && c < (Character.MAX_SURROGATE + 1); + if (isSurrogate) { return -1; } else { da[dp++] = c; @@ -730,8 +731,8 @@ public static int decodeUTF8(byte[] sa, int sp, int len, char[] da) { !Character.isSupplementaryCodePoint(uc)) { return -1; } else { - da[dp++] = Character.highSurrogate(uc); - da[dp++] = Character.lowSurrogate(uc); + da[dp++] = (char) ((uc >>> 10) + (Character.MIN_HIGH_SURROGATE - (Character.MIN_SUPPLEMENTARY_CODE_POINT >>> 10))); // Character.highSurrogate(uc); + da[dp++] = (char) ((uc & 0x3ff) + Character.MIN_LOW_SURROGATE); // Character.lowSurrogate(uc); } continue; } diff --git a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java index 36e679bf3f..441a537e40 100755 --- a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java +++ b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java @@ -1029,6 +1029,9 @@ private static void addBaseClassMappings() { loadClass("java.awt.Point"), loadClass("java.awt.Font"), loadClass("java.awt.Color"), + + loadClass("org.springframework.remoting.support.RemoteInvocation"), + loadClass("org.springframework.remoting.support.RemoteInvocationResult"), }; for (Class clazz : classes) { diff --git a/src/test/java/ArrayTest.java b/src/test/java/ArrayTest.java new file mode 100644 index 0000000000..6d5150be3d --- /dev/null +++ b/src/test/java/ArrayTest.java @@ -0,0 +1,12 @@ +/** + * Created by wenshao on 13/02/2017. + */ +public class ArrayTest { + public static void main(String[] args) { + f(new int[] { 101, 102, 103, 104, 105, 106, 107, 108, 109}); + } + + public static void f(int[] a) { + System.out.println(a.length); + } +} diff --git a/src/test/java/com/alibaba/json/bvt/CurrencyTest4.java b/src/test/java/com/alibaba/json/bvt/CurrencyTest4.java new file mode 100644 index 0000000000..a8b503a146 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/CurrencyTest4.java @@ -0,0 +1,40 @@ +package com.alibaba.json.bvt; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import junit.framework.TestCase; + +import java.util.Currency; +import java.util.Locale; + +public class CurrencyTest4 extends TestCase { + + public void test_0() throws Exception { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("currency", "CNY"); + + String text = JSON.toJSONString(jsonObject); + + Currency currency = JSON.parseObject(text, Currency.class); + + assertSame(Currency.getInstance("CNY"), currency); + } + + public void test_1() throws Exception { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("symbol", "CNY"); + + String text = JSON.toJSONString(jsonObject); + + Currency currency = JSON.parseObject(text, Currency.class); + + assertSame(Currency.getInstance("CNY"), currency); + } + + public static class VO { + public Currency value; + + } +} diff --git a/src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin.java b/src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin.java new file mode 100644 index 0000000000..58cf7e859f --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin.java @@ -0,0 +1,98 @@ +package com.alibaba.json.bvt.bug; + +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; + +import java.io.Serializable; + +/** + * Created by wenshao on 09/02/2017. + */ +public class Bug_for_xujin extends TestCase { + public void test_for_xujin() throws Exception { + String jsonText="{\"module\":{\"auditStatus\":\"PENDING_VERIFICATION\",\"contactId\":\"asdfasdf\",\n\"errorMsg\":\"中国\"},\"success\":true}\n"; + System.out.println(JSON.VERSION); + ResultDTO resultDTO = (ResultDTO) JSON.parseObject(jsonText, ResultDTO.class); + } + + public static class ResultDTO implements Serializable { + private static final long serialVersionUID = 3682481175041925854L; + private static final String DEFAULT_ERR_CODE = "xin.unknown.error"; + private String errorMsg; + private String errorCode; + private boolean success; + private T module; + + public ResultDTO(String errorCode, String errorMsg, T obj) { + this.errorCode = errorCode; + this.errorMsg = errorMsg; + this.success = false; + this.module = obj; + } + + public ResultDTO() { + buildSuccessResult(); + } + + public ResultDTO(T obj) { + this.success = true; + this.module = obj; + } + + public static ResultDTO buildSuccessResult() { + return new ResultDTO((Serializable)null); + } + + public static ResultDTO buildSuccessResult(T obj) { + return new ResultDTO(obj); + } + + public static ResultDTO buildFailedResult(String errCode, String errMsg, T obj) { + return new ResultDTO(errCode, errMsg, obj); + } + + public static ResultDTO buildFailedResult(String errCode, String errMsg) { + return new ResultDTO(errCode, errMsg, (Serializable)null); + } + + public static ResultDTO buildFailedResult(String errMsg) { + return new ResultDTO("xin.unknown.error", errMsg, (Serializable)null); + } + + public String getErrorMsg() { + return this.errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public String getErrorCode() { + return this.errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + public boolean isSuccess() { + return this.success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public T getModule() { + return this.module; + } + + public void setModule(T module) { + this.module = module; + } + + public String toJsonString() { + return JSON.toJSONString(this); + } + } +} diff --git a/src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin2.java b/src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin2.java new file mode 100644 index 0000000000..cbffdb6a48 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin2.java @@ -0,0 +1,128 @@ +package com.alibaba.json.bvt.bug; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializeFilter; +import com.alibaba.fastjson.serializer.ValueFilter; +import junit.framework.TestCase; +import org.apache.commons.lang.builder.ToStringBuilder; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by wenshao on 10/02/2017. + */ +public class Bug_for_xujin2 extends TestCase { + public void test_for_bug() throws Exception { + ContactTemplateParam param = new ContactTemplateParam(); + param.setAuditStatus(AuditStatusType.AUDIT_FAILURE); + + String json = JSON.toJSONString(param, new SerializeFilter[] { new IntEnumFilter("auditStatus") }); + assertEquals("{\"auditStatus\":0}", json); + } + + public static class IntEnumFilter implements ValueFilter { + private Set needMaskFileds = new HashSet(); + + public IntEnumFilter() { + } + + public IntEnumFilter(String... fileds) { + if(fileds != null) { + String[] arr$ = fileds; + int len$ = fileds.length; + + for(int i$ = 0; i$ < len$; ++i$) { + String filed = arr$[i$]; + this.needMaskFileds.add(filed); + } + } + + } + + public Object process(Object object, String name, Object value) { + return value == null?value:(this.needMaskFileds.contains(name) && value instanceof IntEnum ?Integer.valueOf(((IntEnum)value).getCode()):value); + } + } + + public static class ContactTemplateParam implements Serializable { + + private static final long serialVersionUID = 1L; + + + + public ContactTemplateParam() { + // TODO Auto-generated constructor stub + } + + /** 审核状态 **/ + private AuditStatusType auditStatus; + + + + public AuditStatusType getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatusType auditStatus) { + this.auditStatus = auditStatus; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + } + + public static enum AuditStatusType implements IntEnum { + AUDIT_FAILURE(0, "审核失败", "FAILED"), + AUDIT_SUCCESS(1, "成功", "SUCCEED"), + AUDIT_NO_SUBMIT(2, "未实名认证", "NONAUDIT"), + AUDIT_SUBMIT(3, "审核中", "AUDITING"); + + private int code; + private String desc; + private String enCode; + + private AuditStatusType(int code) { + this.code = code; + } + + private AuditStatusType(int code, String desc, String enCode) { + this.code = code; + this.desc = desc; + this.enCode = enCode; + } + + public static AuditStatusType valuesOf(String enCode) { + AuditStatusType[] arr$ = values(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + AuditStatusType temp = arr$[i$]; + if(temp.getEnCode().equals(enCode)) { + return temp; + } + } + + return null; + } + + public String getDesc() { + return this.desc; + } + + public String getEnCode() { + return this.enCode; + } + + public int getCode() { + return this.code; + } + } + + public interface IntEnum> { + int getCode(); + } +} diff --git a/src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin_int.java b/src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin_int.java new file mode 100644 index 0000000000..1600c83084 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/bug/Bug_for_xujin_int.java @@ -0,0 +1,82 @@ +package com.alibaba.json.bvt.bug; + +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; + +import java.io.Serializable; + +/** + * Created by wenshao on 09/02/2017. + */ +public class Bug_for_xujin_int extends TestCase { + public void test_for_xujin() throws Exception { + String jsonText="{\"module\":{\"auditStatus\":\"PENDING_VERIFICATION\",\"contactId\":\"asdfasdf\",\n\"errorMsg\":\"中国\"},\"success\":1}\n"; + System.out.println(JSON.VERSION); + ResultDTO resultDTO = (ResultDTO) JSON.parseObject(jsonText, ResultDTO.class); + } + + public static class ResultDTO implements Serializable { + private static final long serialVersionUID = 3682481175041925854L; + private static final String DEFAULT_ERR_CODE = "xin.unknown.error"; + private String errorMsg; + private String errorCode; + private int success; + private T module; + + + + public ResultDTO() { + buildSuccessResult(); + } + + public ResultDTO(T obj) { + this.success = 1; + this.module = obj; + } + + public static ResultDTO buildSuccessResult() { + return new ResultDTO((Serializable)null); + } + + public static ResultDTO buildSuccessResult(T obj) { + return new ResultDTO(obj); + } + + + public String getErrorMsg() { + return this.errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public String getErrorCode() { + return this.errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + public int isSuccess() { + return this.success; + } + + public void setSuccess(int success) { + this.success = success; + } + + public T getModule() { + return this.module; + } + + public void setModule(T module) { + this.module = module; + } + + public String toJsonString() { + return JSON.toJSONString(this); + } + } +} diff --git a/src/test/java/com/alibaba/json/bvt/bug/Issue1017.java b/src/test/java/com/alibaba/json/bvt/bug/Issue1017.java new file mode 100644 index 0000000000..717bd5c5ef --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/bug/Issue1017.java @@ -0,0 +1,33 @@ +package com.alibaba.json.bvt.bug; + +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by wenshao on 11/02/2017. + */ +public class Issue1017 extends TestCase { + public void test_for_issue() throws Exception { + String json = "{\"pictureList\":[\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\",\"http://common.cnblogs.com/images/icon_weibo_24.png\"]}"; + + User user = JSON.parseObject(json, User.class); + assertNotNull(user.pictureList); + assertEquals(2, user.pictureList.size()); + assertEquals("http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000", user.pictureList.get(0)); + assertEquals("http://common.cnblogs.com/images/icon_weibo_24.png", user.pictureList.get(1)); + } + + public static class User implements Serializable { + private List pictureList; + public List getPictureList() { + return pictureList; + } + public User setPictureList(List pictureList) { + this.pictureList = pictureList; + return this; + } + } +} diff --git a/src/test/java/com/alibaba/json/bvt/parser/autoType/AutoTypeTest0.java b/src/test/java/com/alibaba/json/bvt/parser/autoType/AutoTypeTest0.java new file mode 100644 index 0000000000..00da232b97 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/parser/autoType/AutoTypeTest0.java @@ -0,0 +1,22 @@ +package com.alibaba.json.bvt.parser.autoType; + +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; + +/** + * Created by wenshao on 10/02/2017. + */ +public class AutoTypeTest0 extends TestCase { + public void test_0() throws Exception { + String text = "{\"@type\":\"com.alibaba.json.bvt.parser.autoType.AutoTypeTest0$Model\",\"id\":123}"; + Model model = JSON.parseObject(text, Model.class); + assertEquals(123, model.id); + + Model model2 = (Model) JSON.parse(text); + assertEquals(123, model2.id); + } + + public static class Model { + public int id; + } +} diff --git a/src/test/java/com/alibaba/json/bvt/parser/autoType/AutoTypeTest1.java b/src/test/java/com/alibaba/json/bvt/parser/autoType/AutoTypeTest1.java new file mode 100644 index 0000000000..c9e4cc7f3d --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/parser/autoType/AutoTypeTest1.java @@ -0,0 +1,28 @@ +package com.alibaba.json.bvt.parser.autoType; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.annotation.JSONField; +import com.alibaba.fastjson.annotation.JSONType; +import com.alibaba.fastjson.parser.ParserConfig; +import junit.framework.TestCase; + +/** + * Created by wenshao on 10/02/2017. + */ +public class AutoTypeTest1 extends TestCase { + public void test_0() throws Exception { + ParserConfig config = new ParserConfig(); + config.setAutoTypeSupport(true); + + System.out.println(Model.class.isAnnotationPresent(JSONField.class)); + String text = "{\"@type\":\"com.alibaba.json.bvt.parser.autoType.AutoTypeTest1$Model\",\"id\":123}"; + + Model model2 = (Model) JSON.parseObject(text, Object.class, config); + assertEquals(123, model2.id); + } + + @JSONType + public static class Model { + public int id; + } +} diff --git a/src/test/java/com/alibaba/json/bvt/parser/deser/DupTest.java b/src/test/java/com/alibaba/json/bvt/parser/deser/DupTest.java new file mode 100644 index 0000000000..22aac8e8ea --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/parser/deser/DupTest.java @@ -0,0 +1,20 @@ +package com.alibaba.json.bvt.parser.deser; + +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; + +/** + * Created by wenshao on 13/02/2017. + */ +public class DupTest extends TestCase { + public void test_dup() throws Exception { + String json = "{\"id\":1001,\"_id\":1002}"; + + Model model = JSON.parseObject(json, Model.class); + assertEquals(1001, model.id); + } + + public static class Model { + public int id; + } +} diff --git a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest10.java b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest10.java new file mode 100644 index 0000000000..d8a4eef1f0 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest10.java @@ -0,0 +1,29 @@ +package com.alibaba.json.bvt.parser.deser; + +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; +import org.junit.Assert; + + +public class FieldDeserializerTest10 extends TestCase { + public void test_0 () throws Exception { + Assert.assertEquals(Type.Big, JSON.parseObject("{\"id\":\"Big\"\t}", VO.class).id); + Assert.assertEquals(Type.Big, JSON.parseObject("{\"id\":\"Big\"\t}\n\t", VO.class).id); + Assert.assertEquals(Type.Big, JSON.parseObject("{\"id\":\"Big\" }", V1.class).id); + Assert.assertEquals(Type.Big, JSON.parseObject("{\"id\":\"Big\" }\n", V1.class).id); + Assert.assertEquals(Type.Big, JSON.parseObject("{\"id\":\"Big\" }\n\t", V1.class).id); + Assert.assertEquals(Type.Big, JSON.parseObject("{\"id\":\"Big\"\n}", V1.class).id); + } + + public static class VO { + public Type id; + } + + private static class V1 { + public Type id; + } + + public static enum Type { + Big, Small + } +} diff --git a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest4.java b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest4.java index eece5c2282..6c0e64e82d 100644 --- a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest4.java +++ b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest4.java @@ -9,7 +9,9 @@ public class FieldDeserializerTest4 extends TestCase { public void test_0 () throws Exception { Assert.assertEquals(33, JSON.parseObject("{\"id\":33\t}", VO.class).id); + Assert.assertEquals(33, JSON.parseObject("{\"id\":33\t}\n\t", VO.class).id); Assert.assertEquals(33, JSON.parseObject("{\"id\":33 }", V1.class).id); + Assert.assertEquals(33, JSON.parseObject("{\"id\":33 }\n\t", V1.class).id); Assert.assertEquals(33, JSON.parseObject("{\"id\":33L}", V1.class).id); } diff --git a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest5.java b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest5.java index 5452250802..3ee90c8053 100755 --- a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest5.java +++ b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest5.java @@ -9,7 +9,11 @@ public class FieldDeserializerTest5 extends TestCase { public void test_0 () throws Exception { Assert.assertEquals(33, JSON.parseObject("{\"id\":33\t}", VO.class).id); + Assert.assertEquals(33, JSON.parseObject("{\"id\":33\t}\n\t", VO.class).id); Assert.assertEquals(33, JSON.parseObject("{\"id\":33 }", V1.class).id); + Assert.assertEquals(33, JSON.parseObject("{\"id\":33 } ", V1.class).id); + Assert.assertEquals(33, JSON.parseObject("{\"id\":33 }\n", V1.class).id); + Assert.assertEquals(33, JSON.parseObject("{\"id\":33 }\t\n", V1.class).id); Assert.assertEquals(33, JSON.parseObject("{\"id\":33L}", V1.class).id); } diff --git a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest6.java b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest6.java index 419119538b..5243207abf 100644 --- a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest6.java +++ b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest6.java @@ -9,7 +9,9 @@ public class FieldDeserializerTest6 extends TestCase { public void test_0 () throws Exception { Assert.assertTrue(33F == JSON.parseObject("{\"id\":33\t}", VO.class).id); + Assert.assertTrue(33F == JSON.parseObject("{\"id\":33\t}\n\t", VO.class).id); Assert.assertTrue(33F == JSON.parseObject("{\"id\":33 }", V1.class).id); + Assert.assertTrue(33F == JSON.parseObject("{\"id\":33 }\n\t", V1.class).id); Assert.assertTrue(33F == JSON.parseObject("{\"id\":33L}", V1.class).id); } diff --git a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest7.java b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest7.java index 40b633e284..0522911a4d 100644 --- a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest7.java +++ b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest7.java @@ -9,7 +9,9 @@ public class FieldDeserializerTest7 extends TestCase { public void test_0 () throws Exception { Assert.assertTrue(33F == JSON.parseObject("{\"id\":33\t}", VO.class).id); + Assert.assertTrue(33F == JSON.parseObject("{\"id\":33\t}\n\t", VO.class).id); Assert.assertTrue(33F == JSON.parseObject("{\"id\":33 }", V1.class).id); + Assert.assertTrue(33F == JSON.parseObject("{\"id\":33 }\n\t", V1.class).id); Assert.assertTrue(33F == JSON.parseObject("{\"id\":33L}", V1.class).id); } diff --git a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest8.java b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest8.java index a68d4eb5d8..7880997816 100644 --- a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest8.java +++ b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest8.java @@ -9,7 +9,9 @@ public class FieldDeserializerTest8 extends TestCase { public void test_0 () throws Exception { Assert.assertEquals("33", JSON.parseObject("{\"id\":\"33\"\t}", VO.class).id); + Assert.assertEquals("33", JSON.parseObject("{\"id\":\"33\"\t}\n\t", VO.class).id); Assert.assertEquals("33", JSON.parseObject("{\"id\":\"33\" }", V1.class).id); + Assert.assertEquals("33", JSON.parseObject("{\"id\":\"33\" }\n\t", V1.class).id); Assert.assertEquals("33", JSON.parseObject("{\"id\":\"33\"\n}", V1.class).id); } diff --git a/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest9.java b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest9.java new file mode 100644 index 0000000000..ba676ad9f4 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/parser/deser/FieldDeserializerTest9.java @@ -0,0 +1,32 @@ +package com.alibaba.json.bvt.parser.deser; + +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; +import org.junit.Assert; + + +public class FieldDeserializerTest9 extends TestCase { + public void test_0 () throws Exception { + assertTrue(JSON.parseObject("{\"id\":true\t}", VO.class).id); + assertTrue(JSON.parseObject("{\"id\":true\t}\n\t", VO.class).id); + assertTrue(JSON.parseObject("{\"id\":true }", V1.class).id); + assertTrue(JSON.parseObject("{\"id\":true }\n\t", V1.class).id); + assertTrue(JSON.parseObject("{\"id\":true\n}", V1.class).id); + } + + public void test_1 () throws Exception { + assertFalse(JSON.parseObject("{\"id\":false\t}", VO.class).id); + assertFalse(JSON.parseObject("{\"id\":false\t}\n\t", VO.class).id); + assertFalse(JSON.parseObject("{\"id\":false }", V1.class).id); + assertFalse(JSON.parseObject("{\"id\":false }\n\t", V1.class).id); + assertFalse(JSON.parseObject("{\"id\":false\n}", V1.class).id); + } + + public static class VO { + public boolean id; + } + + private static class V1 { + public boolean id; + } +} diff --git a/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeNotMatchTest.java b/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeNotMatchTest.java new file mode 100644 index 0000000000..23c2971db7 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeNotMatchTest.java @@ -0,0 +1,26 @@ +package com.alibaba.json.bvt.serializer; + +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; + +import java.math.BigInteger; + +/** + * Created by wenshao on 10/02/2017. + */ +public class GenericTypeNotMatchTest extends TestCase { + public void test_for_notMatch() throws Exception { + Model model = new Model(); + Base base = model; + base.id = BigInteger.valueOf(3); + JSON.toJSONString(base); + } + + + public static class Model extends Base { + } + + public static class Base { + public T id; + } +} diff --git a/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeNotMatchTest2.java b/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeNotMatchTest2.java new file mode 100644 index 0000000000..b9637fc13c --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeNotMatchTest2.java @@ -0,0 +1,37 @@ +package com.alibaba.json.bvt.serializer; + +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; + +import java.math.BigInteger; + +/** + * Created by wenshao on 10/02/2017. + */ +public class GenericTypeNotMatchTest2 extends TestCase { + public void test_for_notMatch() throws Exception { + Model model = new Model(); + + Base base = model; + base.setId(BigInteger.valueOf(3)); + + JSON.toJSONString(base); + } + + + public static class Model extends Base { + + } + + public static class Base { + private T xid; + + public void setId(T id) { + this.xid = id; + } + + public T getId() { + return xid; + } + } +} diff --git a/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeTest2.java b/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeTest2.java index db8d191bdf..867235fa9a 100644 --- a/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeTest2.java +++ b/src/test/java/com/alibaba/json/bvt/serializer/GenericTypeTest2.java @@ -16,7 +16,7 @@ public void test_gerneric() throws Exception { public static class MyResultResult extends BaseResult { } - public static class BaseResult implements Serializable { + public static class BaseResult { private T data; public T getData() { return data; diff --git a/src/test/java/com/alibaba/json/bvt/serializer/features/MapSortFieldTest.java b/src/test/java/com/alibaba/json/bvt/serializer/features/MapSortFieldTest.java new file mode 100644 index 0000000000..2d281cc040 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/serializer/features/MapSortFieldTest.java @@ -0,0 +1,22 @@ +package com.alibaba.json.bvt.serializer.features; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import junit.framework.TestCase; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by wenshao on 14/02/2017. + */ +public class MapSortFieldTest extends TestCase { + public void test_mapSortField() throws Exception { + Map map = new HashMap(); + map.put("id", 123); + map.put("name", "wenshao"); + + String json = JSON.toJSONString(map, SerializerFeature.MapSortField); + assertEquals("{\"id\":123,\"name\":\"wenshao\"}", json); + } +} diff --git a/src/test/java/com/alibaba/json/bvt/TypeReferenceTest10.java b/src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest10.java similarity index 93% rename from src/test/java/com/alibaba/json/bvt/TypeReferenceTest10.java rename to src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest10.java index eb9d791a73..5971d1827e 100644 --- a/src/test/java/com/alibaba/json/bvt/TypeReferenceTest10.java +++ b/src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest10.java @@ -1,4 +1,4 @@ -package com.alibaba.json.bvt; +package com.alibaba.json.bvt.typeRef; import com.alibaba.fastjson.TypeReference; import junit.framework.TestCase; diff --git a/src/test/java/com/alibaba/json/bvt/TypeReferenceTest11.java b/src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest11.java similarity index 94% rename from src/test/java/com/alibaba/json/bvt/TypeReferenceTest11.java rename to src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest11.java index 1d670c6a28..fd47921af7 100644 --- a/src/test/java/com/alibaba/json/bvt/TypeReferenceTest11.java +++ b/src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest11.java @@ -1,4 +1,4 @@ -package com.alibaba.json.bvt; +package com.alibaba.json.bvt.typeRef; import com.alibaba.fastjson.TypeReference; import junit.framework.TestCase; diff --git a/src/test/java/com/alibaba/json/bvt/TypeReferenceTest12.java b/src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest12.java similarity index 95% rename from src/test/java/com/alibaba/json/bvt/TypeReferenceTest12.java rename to src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest12.java index c89d0421d7..32af6e62c3 100644 --- a/src/test/java/com/alibaba/json/bvt/TypeReferenceTest12.java +++ b/src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest12.java @@ -1,4 +1,4 @@ -package com.alibaba.json.bvt; +package com.alibaba.json.bvt.typeRef; import com.alibaba.fastjson.TypeReference; import junit.framework.TestCase; diff --git a/src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest13.java b/src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest13.java new file mode 100644 index 0000000000..fd33b3f53c --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/typeRef/TypeReferenceTest13.java @@ -0,0 +1,88 @@ +package com.alibaba.json.bvt.typeRef; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.alibaba.fastjson.annotation.JSONField; +import junit.framework.TestCase; + +/** + * Created by wenshao on 09/02/2017. + */ +public class TypeReferenceTest13 extends TestCase { + public void test_typeRef() throws Exception { + String json = "{\"result\":{}}"; + for (int i = 0; i < 100; ++i) { + { + SearchResult searchResult = parseSearchResult( + json, ResultItem.class, CountFacet.class); + } + { + SearchResult searchResult = parseSearchResult( + json, ResultItem1.class, CountFacet1.class); + } + } + } + + public static SearchResult parseSearchResult(String resultStr, Class itemType, + Class facetType) { + SearchResult searchResult = JSON.parseObject(resultStr, new TypeReference>() { + }); + + return searchResult; + } + + public static class ResultItem { + + } + + public static class CountFacet { + + } + + public static class ResultItem1 { + + } + + public static class CountFacet1 { + + } + + public static class SearchResult extends BaseResult { + + /** + * 大的结果对象,包含结果数据、耗时、数量统计等信息 + */ + @JSONField(name = "result") + private ResultDO result; + + /** + * 目前没有用到 + */ + @JSONField(name = "tracer") + private String tracer; + + public String getTracer() { + return tracer; + } + + public void setTracer(String tracer) { + this.tracer = tracer; + } + + public ResultDO getResult() { + return result; + } + + public void setResult(ResultDO result) { + this.result = result; + } + } + + public static class BaseResult { + + } + + public static class ResultDO { + + } +} diff --git a/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest.java b/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest.java index 84361c4148..4a398eacdb 100755 --- a/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest.java +++ b/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest.java @@ -1,6 +1,5 @@ package com.alibaba.json.bvt.writeClassName; -import com.alibaba.fastjson.parser.ParserConfig; import org.junit.Assert; import junit.framework.TestCase; @@ -10,7 +9,7 @@ public class WriteClassNameTest extends TestCase { protected void setUp() throws Exception { - ParserConfig.global.addAccept("com.alibaba.json.bvt.writeClassName.WriteClassNameTest"); + com.alibaba.fastjson.parser.ParserConfig.getGlobalInstance().addAccept(this.getClass().getName() + "."); } public void test_list() throws Exception { diff --git a/src/test/java/com/alibaba/json/bvtVO/AuditStatusType.java b/src/test/java/com/alibaba/json/bvtVO/AuditStatusType.java new file mode 100644 index 0000000000..b7a60c4c95 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvtVO/AuditStatusType.java @@ -0,0 +1,51 @@ +package com.alibaba.json.bvtVO; + +/** + * Created by wenshao on 10/02/2017. + */ +public enum AuditStatusType implements IntEnum { + AUDIT_FAILURE(0, "审核失败", "FAILED"), + AUDIT_SUCCESS(1, "成功", "SUCCEED"), + AUDIT_NO_SUBMIT(2, "未实名认证", "NONAUDIT"), + AUDIT_SUBMIT(3, "审核中", "AUDITING"); + + private int code; + private String desc; + private String enCode; + + private AuditStatusType(int code) { + this.code = code; + } + + private AuditStatusType(int code, String desc, String enCode) { + this.code = code; + this.desc = desc; + this.enCode = enCode; + } + + public static AuditStatusType valuesOf(String enCode) { + AuditStatusType[] arr$ = values(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + AuditStatusType temp = arr$[i$]; + if(temp.getEnCode().equals(enCode)) { + return temp; + } + } + + return null; + } + + public String getDesc() { + return this.desc; + } + + public String getEnCode() { + return this.enCode; + } + + public int getCode() { + return this.code; + } +} diff --git a/src/test/java/com/alibaba/json/bvtVO/ContactTemplateParam.java b/src/test/java/com/alibaba/json/bvtVO/ContactTemplateParam.java new file mode 100644 index 0000000000..2721f587ca --- /dev/null +++ b/src/test/java/com/alibaba/json/bvtVO/ContactTemplateParam.java @@ -0,0 +1,38 @@ +package com.alibaba.json.bvtVO; + +import java.io.Serializable; +import java.util.Date; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.alibaba.fastjson.annotation.JSONField; + + +public class ContactTemplateParam implements Serializable { + + private static final long serialVersionUID = 1L; + + + + public ContactTemplateParam() { + // TODO Auto-generated constructor stub + } + + /** 审核状态 **/ + private AuditStatusType auditStatus; + + + + public AuditStatusType getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatusType auditStatus) { + this.auditStatus = auditStatus; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/test/java/com/alibaba/json/bvtVO/IntEnum.java b/src/test/java/com/alibaba/json/bvtVO/IntEnum.java new file mode 100644 index 0000000000..e8c898a15a --- /dev/null +++ b/src/test/java/com/alibaba/json/bvtVO/IntEnum.java @@ -0,0 +1,8 @@ +package com.alibaba.json.bvtVO; + +/** + * Created by wenshao on 10/02/2017. + */ +public interface IntEnum> { + int getCode(); +} \ No newline at end of file diff --git a/src/test/java/com/alibaba/json/demo/ReuseObject.java b/src/test/java/com/alibaba/json/demo/ReuseObject.java new file mode 100644 index 0000000000..e98f3f4a37 --- /dev/null +++ b/src/test/java/com/alibaba/json/demo/ReuseObject.java @@ -0,0 +1,35 @@ +package com.alibaba.json.demo; + +import com.alibaba.fastjson.parser.DefaultJSONParser; +import junit.framework.TestCase; + +/** + * Created by wenshao on 11/02/2017. + */ +public class ReuseObject extends TestCase { + public void test_reuse() throws Exception { +Model model = new Model(); + +{ + DefaultJSONParser parser = new DefaultJSONParser("{\"id\":123,\"name\":\"wangsai-silence\"}"); + parser.parseObject(model); + parser.close(); // 调用close能重用buf,提升性能 + + assertEquals(123, model.id); + assertEquals("wangsai-silence", model.name); +} + +{ + DefaultJSONParser parser = new DefaultJSONParser("{\"id\":234,\"name\":\"wenshao\"}"); + parser.parseObject(model); + parser.close(); // 调用close能重用buf,提升性能 + + assertEquals(234, model.id); + assertEquals("wenshao", model.name); +} + } +public static class Model { + public int id; + public String name; +} +} diff --git a/src/test/java/com/alibaba/json/test/JsonIteratorByteArrayTest.java b/src/test/java/com/alibaba/json/test/JsonIteratorByteArrayTest.java new file mode 100644 index 0000000000..5e76261a24 --- /dev/null +++ b/src/test/java/com/alibaba/json/test/JsonIteratorByteArrayTest.java @@ -0,0 +1,57 @@ +package com.alibaba.json.test; + +import com.alibaba.fastjson.JSON; +import com.jsoniter.JsonIterator; +import junit.framework.TestCase; + +/** + * Created by wenshao on 27/12/2016. + */ +public class JsonIteratorByteArrayTest extends TestCase { + public void test_for_iterator() throws Exception { + String text = "{\"id\":1001,\"name\":\"wenshao\",\"type\":\"Small\"}"; + byte[] bytes = text.getBytes(); + + + fastjson(bytes); + + + for (int i = 0; i < 10; ++i) { + long startMillis = System.currentTimeMillis(); + fastjson(bytes); + long millis = System.currentTimeMillis() - startMillis; + System.out.println("fastjson : " + millis); + } + +// jsoniterator(bytes); +// for (int i = 0; i < 10; ++i) { +// long startMillis = System.currentTimeMillis(); +// jsoniterator(bytes); +// long millis = System.currentTimeMillis() - startMillis; +// System.out.println("jsoniterator : " + millis); +// } + } + + private void jsoniterator(byte[] text) throws java.io.IOException { + for (int i = 0; i < 1000 * 1000 * 10; ++i){ + JsonIterator it = JsonIterator.parse(text); + Model model2 = it.read(Model.class); + } + } + + private void fastjson(byte[] text) throws java.io.IOException { + for (int i = 0; i < 1000 * 1000 * 10; ++i){ + Model model2 = JSON.parseObject(text, Model.class); + } + } + + public static class Model { + public int id; + public String name; + // public Type type; + } + + public static enum Type { + Big, Small + } +} diff --git a/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java b/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java index 209cbc765b..514817ae3a 100644 --- a/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java +++ b/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java @@ -208,7 +208,7 @@ public Object deserialze(DefaultJSONParser parser, Type type, Object fieldName) } if (restFlag) { - return super.parseRest(parser, type, fieldName, instance, 0); + return super.parseRest(parser, type, fieldName, instance, 0, new int[0]); } return instance; diff --git a/src/test/java/data/media/ImageGenDecoder.java b/src/test/java/data/media/ImageGenDecoder.java index 6135e30592..e2cadf79d8 100644 --- a/src/test/java/data/media/ImageGenDecoder.java +++ b/src/test/java/data/media/ImageGenDecoder.java @@ -169,7 +169,7 @@ public Object deserialze(DefaultJSONParser parser, Type type, Object fieldName) } if (restFlag) { - return super.parseRest(parser, type, fieldName, instance, 0); + return super.parseRest(parser, type, fieldName, instance, 0, new int[0]); } return instance; diff --git a/src/test/java/data/media/MediaContentGenDecoder.java b/src/test/java/data/media/MediaContentGenDecoder.java index 038f34cd22..ff7082f7ee 100644 --- a/src/test/java/data/media/MediaContentGenDecoder.java +++ b/src/test/java/data/media/MediaContentGenDecoder.java @@ -153,7 +153,7 @@ public Object deserialze(DefaultJSONParser parser, Type type, Object fieldName) } if (restFlag) { - return super.parseRest(parser, type, fieldName, instance, 0); + return super.parseRest(parser, type, fieldName, instance, 0, new int[0]); } return instance; diff --git a/src/test/java/data/media/MediaGenDecoder.java b/src/test/java/data/media/MediaGenDecoder.java index 902b278730..adb9e59c97 100644 --- a/src/test/java/data/media/MediaGenDecoder.java +++ b/src/test/java/data/media/MediaGenDecoder.java @@ -306,7 +306,7 @@ public Object deserialze(DefaultJSONParser parser, Type type, Object fieldName) } if (restFlag) { - return super.parseRest(parser, type, fieldName, instance, 0); + return super.parseRest(parser, type, fieldName, instance, 0, new int[0]); } return instance;