package org.zbus.common.json.parser.deserializer; import java.lang.reflect.Type; import java.util.Map; import org.zbus.common.json.parser.DefaultJSONParser; import org.zbus.common.json.parser.JSONLexer; import org.zbus.common.json.parser.ParserConfig; import org.zbus.common.json.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 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; } }