package com.alibaba.fastjson.parser.deserializer; import java.lang.reflect.Type; import java.util.Map; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.parser.JSONScanner; 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) { JSONScanner lexer = (JSONScanner) 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) { if (!parser.isEnabled(Feature.IgnoreNotMatch)) { throw new JSONException("setter not found, class " + serializer.getClass() + ", property " + key); } lexer.nextTokenWithColon(); parser.parse(); // skip 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); } } }