package com.alibaba.fastjson.parser.deserializer;
import java.lang.reflect.Type;
import java.util.Map;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.JSONLexer;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.util.FieldInfo;
public abstract class ASMJavaBeanDeserializer implements ObjectDeserializer {
protected InnerJavaBeanDeserializer serializer;
public ASMJavaBeanDeserializer(ParserConfig mapping, Class<?> clazz){
serializer = new InnerJavaBeanDeserializer(mapping, clazz);
serializer.getFieldDeserializerMap();
}
public abstract Object createInstance(DefaultJSONParser parser, Type type);
public InnerJavaBeanDeserializer getInnterSerializer() {
return serializer;
}
@SuppressWarnings("unchecked")
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
return (T) serializer.deserialze(parser, type, fieldName);
}
public int getFastMatchToken() {
return serializer.getFastMatchToken();
}
public Object createInstance(DefaultJSONParser parser) {
return serializer.createInstance(parser, serializer.getClazz());
}
public FieldDeserializer createFieldDeserializer(ParserConfig mapping, Class<?> clazz, FieldInfo fieldInfo) {
return mapping.createFieldDeserializer(mapping, clazz, fieldInfo);
}
public FieldDeserializer getFieldDeserializer(String name) {
return serializer.getFieldDeserializerMap().get(name);
}
public Type getFieldType(String name) {
return serializer.getFieldDeserializerMap().get(name).getFieldType();
}
public boolean parseField(DefaultJSONParser parser, String key, Object object, Type objectType,
Map<String, Object> fieldValues) {
JSONLexer lexer = parser.getLexer(); // xxx
Map<String, FieldDeserializer> feildDeserializerMap = serializer.getFieldDeserializerMap();
FieldDeserializer fieldDeserializer = feildDeserializerMap.get(key);
if (fieldDeserializer == null) {
for (Map.Entry<String, FieldDeserializer> entry : feildDeserializerMap.entrySet()) {
if (entry.getKey().equalsIgnoreCase(key)) {
fieldDeserializer = entry.getValue();
break;
}
}
}
if (fieldDeserializer == null) {
this.serializer.parseExtra(parser, object, key);
return false;
}
lexer.nextTokenWithColon(fieldDeserializer.getFastMatchToken());
fieldDeserializer.parseField(parser, object, objectType, fieldValues);
return true;
}
public final class InnerJavaBeanDeserializer extends JavaBeanDeserializer {
private InnerJavaBeanDeserializer(ParserConfig mapping, Class<?> clazz){
super(mapping, clazz);
}
public boolean parseField(DefaultJSONParser parser, String key, Object object, Type objectType,
Map<String, Object> fieldValues) {
return ASMJavaBeanDeserializer.this.parseField(parser, key, object, objectType, fieldValues);
}
public FieldDeserializer createFieldDeserializer(ParserConfig mapping, Class<?> clazz, FieldInfo fieldInfo) {
return ASMJavaBeanDeserializer.this.createFieldDeserializer(mapping, clazz, fieldInfo);
}
}
public boolean isSupportArrayToBean(JSONLexer lexer) {
return serializer.isSupportArrayToBean(lexer);
}
public Object parseRest(DefaultJSONParser parser, Type type, Object fieldName, Object instance) {
// serializer.parseField(parser, key, object, objectType, fieldValues)
Object value = serializer.deserialze(parser, type, fieldName, instance);
return value;
}
}