Skip to content

Commit

Permalink
refactor from android branch
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Apr 6, 2016
1 parent b0276a0 commit a4b44fb
Show file tree
Hide file tree
Showing 8 changed files with 109 additions and 119 deletions.
20 changes: 10 additions & 10 deletions src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java
Expand Up @@ -772,7 +772,13 @@ public Object[] parseArray(Type[] types) {


public void parseObject(Object object) { public void parseObject(Object object) {
Class<?> clazz = object.getClass(); Class<?> clazz = object.getClass();
Map<String, FieldDeserializer> setters = config.getFieldDeserializers(clazz); JavaBeanDeserializer beanDeser = null;
ObjectDeserializer deserizer = config.getDeserializer(clazz);
if (deserizer instanceof JavaBeanDeserializer) {
beanDeser = (JavaBeanDeserializer) deserizer;
} else if (deserizer instanceof ASMJavaBeanDeserializer) {
beanDeser = ((ASMJavaBeanDeserializer) deserizer).getInnterSerializer();
}


if (lexer.token() != JSONToken.LBRACE && lexer.token() != JSONToken.COMMA) { if (lexer.token() != JSONToken.LBRACE && lexer.token() != JSONToken.COMMA) {
throw new JSONException("syntax error, expect {, actual " + lexer.tokenName()); throw new JSONException("syntax error, expect {, actual " + lexer.tokenName());
Expand All @@ -794,15 +800,9 @@ public void parseObject(Object object) {
} }
} }


FieldDeserializer fieldDeser = setters.get(key); FieldDeserializer fieldDeser = null;

if (beanDeser != null) {
if (fieldDeser == null && key != null) { fieldDeser = beanDeser.getFieldDeserializer(key);
for (Map.Entry<String, FieldDeserializer> entry : setters.entrySet()) {
if (key.equalsIgnoreCase((entry.getKey()))) {
fieldDeser = entry.getValue();
break;
}
}
} }


if (fieldDeser == null) { if (fieldDeser == null) {
Expand Down
16 changes: 1 addition & 15 deletions src/main/java/com/alibaba/fastjson/parser/ParserConfig.java
Expand Up @@ -41,7 +41,6 @@
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Currency; import java.util.Currency;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
Expand Down Expand Up @@ -71,7 +70,6 @@
import com.alibaba.fastjson.annotation.JSONType; import com.alibaba.fastjson.annotation.JSONType;
import com.alibaba.fastjson.asm.ASMException; import com.alibaba.fastjson.asm.ASMException;
import com.alibaba.fastjson.parser.deserializer.ASMDeserializerFactory; import com.alibaba.fastjson.parser.deserializer.ASMDeserializerFactory;
import com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer;
import com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer; import com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer;
import com.alibaba.fastjson.parser.deserializer.AutowiredObjectDeserializer; import com.alibaba.fastjson.parser.deserializer.AutowiredObjectDeserializer;
import com.alibaba.fastjson.parser.deserializer.BooleanFieldDeserializer; import com.alibaba.fastjson.parser.deserializer.BooleanFieldDeserializer;
Expand Down Expand Up @@ -112,9 +110,9 @@
import com.alibaba.fastjson.serializer.ReferenceCodec; import com.alibaba.fastjson.serializer.ReferenceCodec;
import com.alibaba.fastjson.serializer.StringCodec; import com.alibaba.fastjson.serializer.StringCodec;
import com.alibaba.fastjson.util.ASMUtils; import com.alibaba.fastjson.util.ASMUtils;
import com.alibaba.fastjson.util.JavaBeanInfo;
import com.alibaba.fastjson.util.FieldInfo; import com.alibaba.fastjson.util.FieldInfo;
import com.alibaba.fastjson.util.IdentityHashMap; import com.alibaba.fastjson.util.IdentityHashMap;
import com.alibaba.fastjson.util.JavaBeanInfo;
import com.alibaba.fastjson.util.ServiceLoader; import com.alibaba.fastjson.util.ServiceLoader;


/** /**
Expand Down Expand Up @@ -668,18 +666,6 @@ private static Field getField0(Class<?> clazz, String fieldName) {
return null; return null;
} }


public Map<String, FieldDeserializer> getFieldDeserializers(Class<?> clazz) {
ObjectDeserializer deserizer = getDeserializer(clazz);

if (deserizer instanceof JavaBeanDeserializer) {
return ((JavaBeanDeserializer) deserizer).getFieldDeserializerMap();
} else if (deserizer instanceof ASMJavaBeanDeserializer) {
return ((ASMJavaBeanDeserializer) deserizer).getInnterSerializer().getFieldDeserializerMap();
} else {
return Collections.emptyMap();
}
}

public ClassLoader getDefaultClassLoader() { public ClassLoader getDefaultClassLoader() {
return defaultClassLoader; return defaultClassLoader;
} }
Expand Down
Expand Up @@ -1325,13 +1325,6 @@ private void _init(ClassWriter cw, Context context) {
mw.visitMethodInsn(INVOKESPECIAL, "com/alibaba/fastjson/parser/deserializer/ASMJavaBeanDeserializer", "<init>", mw.visitMethodInsn(INVOKESPECIAL, "com/alibaba/fastjson/parser/deserializer/ASMJavaBeanDeserializer", "<init>",
"(Lcom/alibaba/fastjson/parser/ParserConfig;Ljava/lang/Class;)V"); "(Lcom/alibaba/fastjson/parser/ParserConfig;Ljava/lang/Class;)V");


mw.visitVarInsn(ALOAD, 0);
mw.visitFieldInsn(GETFIELD, "com/alibaba/fastjson/parser/deserializer/ASMJavaBeanDeserializer", "serializer",
"Lcom/alibaba/fastjson/parser/deserializer/ASMJavaBeanDeserializer$InnerJavaBeanDeserializer;");
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer", "getFieldDeserializerMap",
"()Ljava/util/Map;");
mw.visitInsn(POP);

// init fieldNamePrefix // init fieldNamePrefix
for (int i = 0, size = context.fieldInfoList.length; i < size; ++i) { for (int i = 0, size = context.fieldInfoList.length; i < size; ++i) {
FieldInfo fieldInfo = context.fieldInfoList[i]; FieldInfo fieldInfo = context.fieldInfoList[i];
Expand Down
Expand Up @@ -15,8 +15,6 @@ public abstract class ASMJavaBeanDeserializer implements ObjectDeserializer {


public ASMJavaBeanDeserializer(ParserConfig mapping, Class<?> clazz){ public ASMJavaBeanDeserializer(ParserConfig mapping, Class<?> clazz){
serializer = new InnerJavaBeanDeserializer(mapping, clazz); serializer = new InnerJavaBeanDeserializer(mapping, clazz);

serializer.getFieldDeserializerMap();
} }


public abstract Object createInstance(DefaultJSONParser parser, Type type); public abstract Object createInstance(DefaultJSONParser parser, Type type);
Expand All @@ -43,11 +41,11 @@ public FieldDeserializer createFieldDeserializer(ParserConfig mapping, JavaBeanI
} }


public FieldDeserializer getFieldDeserializer(String name) { public FieldDeserializer getFieldDeserializer(String name) {
return serializer.getFieldDeserializerMap().get(name); return serializer.getFieldDeserializer(name);
} }


public Type getFieldType(String name) { public Type getFieldType(String name) {
return serializer.getFieldDeserializerMap().get(name).getFieldType(); return serializer.getFieldDeserializer(name).getFieldType();
} }


public boolean parseField(DefaultJSONParser parser, String key, Object object, Type objectType, public boolean parseField(DefaultJSONParser parser, String key, Object object, Type objectType,
Expand Down
Expand Up @@ -4,9 +4,7 @@
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;


Expand All @@ -22,73 +20,72 @@
import com.alibaba.fastjson.parser.ParseContext; import com.alibaba.fastjson.parser.ParseContext;
import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.FilterUtils; import com.alibaba.fastjson.serializer.FilterUtils;
import com.alibaba.fastjson.util.JavaBeanInfo;
import com.alibaba.fastjson.util.FieldInfo; import com.alibaba.fastjson.util.FieldInfo;
import com.alibaba.fastjson.util.JavaBeanInfo;
import com.alibaba.fastjson.util.TypeUtils; import com.alibaba.fastjson.util.TypeUtils;


public class JavaBeanDeserializer implements ObjectDeserializer { public class JavaBeanDeserializer implements ObjectDeserializer {


private final Map<String, FieldDeserializer> feildDeserializerMap = new IdentityHashMap<String, FieldDeserializer>(); private final FieldDeserializer[] fieldDeserializers;

private final FieldDeserializer[] sortedFieldDeserializers;
private final List<FieldDeserializer> fieldDeserializers = new ArrayList<FieldDeserializer>(); private final Class<?> clazz;
private final List<FieldDeserializer> sortedFieldDeserializers = new ArrayList<FieldDeserializer>(); private JavaBeanInfo beanInfo;


private final Class<?> clazz;

private JavaBeanInfo beanInfo;


public JavaBeanDeserializer(ParserConfig config, Class<?> clazz){ public JavaBeanDeserializer(ParserConfig config, Class<?> clazz){
this(config, clazz, clazz); this(config, clazz, clazz);
} }


public JavaBeanDeserializer(ParserConfig config, Class<?> clazz, Type type){ public JavaBeanDeserializer(ParserConfig config, Class<?> clazz, Type type){
this.clazz = clazz; this.clazz = clazz;

beanInfo = JavaBeanInfo.build(clazz, type); beanInfo = JavaBeanInfo.build(clazz, type);


for (FieldInfo fieldInfo : beanInfo.fields) { sortedFieldDeserializers = new FieldDeserializer[beanInfo.sortedFields.length];
addFieldDeserializer(config, clazz, fieldInfo); for (int i = 0, size = beanInfo.sortedFields.length; i < size; ++i) {
FieldInfo fieldInfo = beanInfo.sortedFields[i];
FieldDeserializer fieldDeserializer = createFieldDeserializer(config, clazz, fieldInfo);

sortedFieldDeserializers[i] = fieldDeserializer;
} }


for (FieldInfo fieldInfo : beanInfo.sortedFields) { fieldDeserializers = new FieldDeserializer[beanInfo.fields.length];
FieldDeserializer fieldDeserializer = feildDeserializerMap.get(fieldInfo.name.intern()); for (int i = 0, size = beanInfo.fields.length; i < size; ++i) {
sortedFieldDeserializers.add(fieldDeserializer); FieldInfo fieldInfo = beanInfo.fields[i];
FieldDeserializer fieldDeserializer = getFieldDeserializer(fieldInfo.name);
fieldDeserializers[i] = fieldDeserializer;
} }
} }


public Map<String, FieldDeserializer> getFieldDeserializerMap() { public FieldDeserializer getFieldDeserializer(String key) {
return feildDeserializerMap; if (key == null) {
} return null;

public FieldDeserializer getFieldDeserializer(String name) {
FieldDeserializer feildDeser = feildDeserializerMap.get(name);

if (feildDeser != null) {
return feildDeser;
} }


for (Map.Entry<String, FieldDeserializer> entry : feildDeserializerMap.entrySet()) { int low = 0;
if (name.equals(entry.getKey())) { int high = sortedFieldDeserializers.length - 1;
return entry.getValue();
while (low <= high) {
int mid = (low + high) >>> 1;

String fieldName = sortedFieldDeserializers[mid].fieldInfo.name;

int cmp = fieldName.compareTo(key);

if (cmp < 0) {
low = mid + 1;
} else if (cmp > 0) {
high = mid - 1;
} else {
return sortedFieldDeserializers[mid]; // key found
} }
} }


return null; return null; // key not found.
} }


public Class<?> getClazz() { public Class<?> getClazz() {
return clazz; return clazz;
} }


private void addFieldDeserializer(ParserConfig mapping, Class<?> clazz, FieldInfo fieldInfo) {
String interName = fieldInfo.name.intern();
FieldDeserializer fieldDeserializer = createFieldDeserializer(mapping, clazz, fieldInfo);

feildDeserializerMap.put(interName, fieldDeserializer);
fieldDeserializers.add(fieldDeserializer);
}

public FieldDeserializer createFieldDeserializer(ParserConfig mapping, Class<?> clazz, FieldInfo fieldInfo) { public FieldDeserializer createFieldDeserializer(ParserConfig mapping, Class<?> clazz, FieldInfo fieldInfo) {
return mapping.createFieldDeserializer(mapping, beanInfo, fieldInfo); return mapping.createFieldDeserializer(mapping, beanInfo, fieldInfo);
} }
Expand Down Expand Up @@ -148,10 +145,9 @@ public <T> T deserialzeArrayMapping(DefaultJSONParser parser, Type type, Object


object = createInstance(parser, type); object = createInstance(parser, type);


int size = sortedFieldDeserializers.size(); for (int i = 0, size = sortedFieldDeserializers.length; i < size; ++i) {
for (int i = 0; i < size; ++i) {
final char seperator = (i == size - 1) ? ']' : ','; final char seperator = (i == size - 1) ? ']' : ',';
FieldDeserializer fieldDeser = sortedFieldDeserializers.get(i); FieldDeserializer fieldDeser = sortedFieldDeserializers[i];
Class<?> fieldClass = fieldDeser.getFieldClass(); Class<?> fieldClass = fieldDeser.getFieldClass();
if (fieldClass == int.class) { if (fieldClass == int.class) {
int value = lexer.scanInt(seperator); int value = lexer.scanInt(seperator);
Expand Down Expand Up @@ -250,8 +246,8 @@ public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName, O
FieldDeserializer fieldDeser = null; FieldDeserializer fieldDeser = null;
FieldInfo fieldInfo = null; FieldInfo fieldInfo = null;
Class<?> fieldClass = null; Class<?> fieldClass = null;
if (fieldIndex < sortedFieldDeserializers.size()) { if (fieldIndex < sortedFieldDeserializers.length) {
fieldDeser = sortedFieldDeserializers.get(fieldIndex); fieldDeser = sortedFieldDeserializers[fieldIndex];
fieldInfo = fieldDeser.fieldInfo; fieldInfo = fieldDeser.fieldInfo;
fieldClass = fieldInfo.fieldClass; fieldClass = fieldInfo.fieldClass;
} }
Expand Down Expand Up @@ -422,7 +418,7 @@ public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName, O
if (object == null && fieldValues == null) { if (object == null && fieldValues == null) {
object = createInstance(parser, type); object = createInstance(parser, type);
if (object == null) { if (object == null) {
fieldValues = new HashMap<String, Object>(this.fieldDeserializers.size()); fieldValues = new HashMap<String, Object>(this.fieldDeserializers.length);
} }
childContext = parser.setContext(context, object, fieldName); childContext = parser.setContext(context, object, fieldName);
} }
Expand Down Expand Up @@ -554,12 +550,12 @@ public boolean parseField(DefaultJSONParser parser, String key, Object object, T
} }


public FieldDeserializer smartMatch(String key) { public FieldDeserializer smartMatch(String key) {
FieldDeserializer fieldDeserializer = feildDeserializerMap.get(key); FieldDeserializer fieldDeserializer = getFieldDeserializer(key);


if (fieldDeserializer == null) { if (fieldDeserializer == null) {
for (Map.Entry<String, FieldDeserializer> entry : feildDeserializerMap.entrySet()) { for (FieldDeserializer fieldDeser : sortedFieldDeserializers) {
if (entry.getKey().equalsIgnoreCase(key)) { if (fieldDeser.fieldInfo.name.equalsIgnoreCase(key)) {
fieldDeserializer = entry.getValue(); fieldDeserializer = fieldDeser;
break; break;
} }
} }
Expand All @@ -568,12 +564,12 @@ public FieldDeserializer smartMatch(String key) {
if (fieldDeserializer == null) { if (fieldDeserializer == null) {
if (key.indexOf('_') != -1) { if (key.indexOf('_') != -1) {
String key2 = key.replaceAll("_", ""); String key2 = key.replaceAll("_", "");
fieldDeserializer = feildDeserializerMap.get(key2); fieldDeserializer = getFieldDeserializer(key2);


if (fieldDeserializer == null) { if (fieldDeserializer == null) {
for (Map.Entry<String, FieldDeserializer> entry : feildDeserializerMap.entrySet()) { for (FieldDeserializer fieldDeser : sortedFieldDeserializers) {
if (entry.getKey().equalsIgnoreCase(key2)) { if (fieldDeser.fieldInfo.name.equalsIgnoreCase(key2)) {
fieldDeserializer = entry.getValue(); fieldDeserializer = fieldDeser;
break; break;
} }
} }
Expand Down Expand Up @@ -606,10 +602,6 @@ public int getFastMatchToken() {
} }




public List<FieldDeserializer> getSortedFieldDeserializers() {
return sortedFieldDeserializers;
}

public final boolean isSupportArrayToBean(JSONLexer lexer) { public final boolean isSupportArrayToBean(JSONLexer lexer) {
return Feature.isEnabled(beanInfo.parserFeatures, Feature.SupportArrayToBean) || lexer.isEnabled(Feature.SupportArrayToBean); return Feature.isEnabled(beanInfo.parserFeatures, Feature.SupportArrayToBean) || lexer.isEnabled(Feature.SupportArrayToBean);
} }
Expand Down

0 comments on commit a4b44fb

Please sign in to comment.