improved deserialzeArrayMapping

This commit is contained in:
高铁
2016-04-28 13:31:05 +08:00
parent 64d2ce8daf
commit 2d108df3e5
3 changed files with 27 additions and 8 deletions
@@ -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<String, Object> fieldValues) {
@@ -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;
@@ -97,7 +97,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
return deserialze(parser, type, fieldName, null);
}
@SuppressWarnings({ "unchecked" })
@SuppressWarnings({ "unchecked", "rawtypes" })
private <T> 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<? extends Enum>) fieldClass, enumName);
char ch = lexer.ch;
Object value;
if (ch == '\"') {
String enumName = lexer.scanSymbol(parser.symbolTable);
value = (enumName == null) //
? null//
: Enum.valueOf((Class<? extends Enum>) 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 == ',') {