mirror of
https://github.com/alibaba/fastjson.git
synced 2026-10-29 14:10:25 +08:00
improved deserialzeArrayMapping
This commit is contained in:
@@ -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 == ',') {
|
||||
|
||||
Reference in New Issue
Block a user