diff --git a/src/main/java/com/alibaba/fastjson/parser/DefaultFieldDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/DefaultFieldDeserializer.java index b5e95f03e..27facc1a7 100755 --- a/src/main/java/com/alibaba/fastjson/parser/DefaultFieldDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/DefaultFieldDeserializer.java @@ -11,11 +11,19 @@ import com.alibaba.fastjson.util.FieldInfo; public class DefaultFieldDeserializer extends FieldDeserializer { - private ObjectDeserializer fieldValueDeserilizer; + protected ObjectDeserializer fieldValueDeserilizer; public DefaultFieldDeserializer(ParserConfig mapping, Class clazz, FieldInfo fieldInfo){ super(clazz, fieldInfo, JSONToken.LITERAL_INT); } + + public ObjectDeserializer getFieldValueDeserilizer(ParserConfig config) { + if (fieldValueDeserilizer == null) { + fieldValueDeserilizer = config.getDeserializer(fieldInfo.fieldClass, fieldInfo.fieldType); + } + + return fieldValueDeserilizer; + } @Override public void parseField(DefaultJSONParser parser, Object object, Type objectType, Map fieldValues) { diff --git a/src/main/java/com/alibaba/fastjson/parser/EnumDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/EnumDeserializer.java index b0e85b91e..ad4c44150 100755 --- a/src/main/java/com/alibaba/fastjson/parser/EnumDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/EnumDeserializer.java @@ -9,7 +9,7 @@ import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; public class EnumDeserializer implements ObjectDeserializer { private final Class enumClass; - private final Enum[] values; + protected final Enum[] values; public EnumDeserializer(Class enumClass){ this.enumClass = enumClass; diff --git a/src/main/java/com/alibaba/fastjson/parser/JavaBeanDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/JavaBeanDeserializer.java index 592fbade9..088803a8e 100755 --- a/src/main/java/com/alibaba/fastjson/parser/JavaBeanDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/JavaBeanDeserializer.java @@ -97,7 +97,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { return deserialze(parser, type, fieldName, null); } - @SuppressWarnings({ "unchecked" }) + @SuppressWarnings({ "unchecked", "rawtypes" }) private T deserialzeArrayMapping(DefaultJSONParser parser, Type type, Object fieldName, Object object) { final JSONLexer lexer = parser.lexer; // xxx object = createInstance(parser, type); @@ -218,11 +218,22 @@ public class JavaBeanDeserializer implements ObjectDeserializer { lexer.nextToken(); } } else if (fieldClass.isEnum()) { - String enumName = lexer.scanSymbol(parser.symbolTable); - @SuppressWarnings("rawtypes") - Object value = enumName == null // - ? null// - : Enum.valueOf((Class) fieldClass, enumName); + char ch = lexer.ch; + Object value; + if (ch == '\"') { + String enumName = lexer.scanSymbol(parser.symbolTable); + value = (enumName == null) // + ? null// + : Enum.valueOf((Class) fieldClass, enumName); + } else if (ch >= '0' && ch <= '9') { + int ordinal = (int) lexer.scanLongValue(); + + EnumDeserializer enumDeser = (EnumDeserializer) ((DefaultFieldDeserializer) fieldDeser).getFieldValueDeserilizer(parser.config); + value = enumDeser.values[ordinal]; + } else { + throw new JSONException("illegal enum." + lexer.info()); + } + fieldDeser.setValue(object, value); if (lexer.ch == ',') {