backport feature 'JSONField.alternateNames' to android.

This commit is contained in:
wenshao
2017-05-14 16:55:10 +08:00
parent e77aa832ba
commit 0ef067da2b
4 changed files with 69 additions and 2 deletions
@@ -47,4 +47,6 @@ public @interface JSONField {
SerializerFeature[] serialzeFeatures() default {};
Feature[] parseFeatures() default {};
String[] alternateNames() default {};
}
@@ -23,6 +23,9 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
private final FieldDeserializer[] fieldDeserializers;
private final FieldDeserializer[] sortedFieldDeserializers;
private final Map<String, FieldDeserializer> alterNameFieldDeserializers;
private final Class<?> clazz;
public final JavaBeanInfo beanInfo;
private ConcurrentMap<String, Object> extraFieldDeserializers;
@@ -34,14 +37,23 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
public JavaBeanDeserializer(ParserConfig config, Class<?> clazz, Type type, JavaBeanInfo beanInfo){
this.clazz = clazz;
this.beanInfo = beanInfo;
Map<String, FieldDeserializer> alterNameFieldDeserializers = null;
sortedFieldDeserializers = new FieldDeserializer[beanInfo.sortedFields.length];
for (int i = 0, size = beanInfo.sortedFields.length; i < size; ++i) {
FieldInfo fieldInfo = beanInfo.sortedFields[i];
FieldDeserializer fieldDeserializer = config.createFieldDeserializer(config, clazz, fieldInfo);
sortedFieldDeserializers[i] = fieldDeserializer;
for (String name : fieldInfo.alternateNames) {
if (alterNameFieldDeserializers == null) {
alterNameFieldDeserializers = new HashMap<String, FieldDeserializer>();
}
alterNameFieldDeserializers.put(name, fieldDeserializer);
}
}
this.alterNameFieldDeserializers = alterNameFieldDeserializers;
fieldDeserializers = new FieldDeserializer[beanInfo.fields.length];
for (int i = 0, size = beanInfo.fields.length; i < size; ++i) {
@@ -863,6 +875,10 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
return sortedFieldDeserializers[mid]; // key found
}
}
if (alterNameFieldDeserializers != null) {
return alterNameFieldDeserializers.get(key);
}
return null; // key not found.
}
@@ -10,6 +10,7 @@ import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Arrays;
import com.alibaba.fastjson.annotation.JSONField;
@@ -37,6 +38,8 @@ public class FieldInfo implements Comparable<FieldInfo> {
public final long nameHashCode;
public final String[] alternateNames;
public FieldInfo(String name, //
Class<?> declaringClass, //
Class<?> fieldClass, //
@@ -76,6 +79,7 @@ public class FieldInfo implements Comparable<FieldInfo> {
this.nameHashCode = hashCode;
this.format = null;
this.alternateNames = new String[0];
}
public FieldInfo(String name, //
@@ -103,6 +107,11 @@ public class FieldInfo implements Comparable<FieldInfo> {
if (format.trim().length() == 0) {
format = null;
}
alternateNames = annotation.alternateNames();
Arrays.sort(alternateNames);
} else {
alternateNames = new String[0];
}
this.format = format;
@@ -191,10 +200,15 @@ public class FieldInfo implements Comparable<FieldInfo> {
this.fieldType = genericFieldType;
this.fieldClass = fieldClass;
isEnum = (!fieldClass.isArray()) && fieldClass.isEnum();
}
public boolean alternateName(String name) {
int index = Arrays.binarySearch(this.alternateNames, name);
return index >= 0;
}
public static Type getFieldType(Class<?> clazz, Type type, Type fieldType) {
if (clazz == null || type == null) {
return fieldType;
@@ -0,0 +1,35 @@
package com.alibaba.json.bvt.issue_1100;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import junit.framework.TestCase;
/**
* Created by wenshao on 14/05/2017.
*/
public class Issue1199 extends TestCase {
public void test_for_issue() throws Exception {
String jsonVal0 = "{\"id\":5001,\"name\":\"Jobs\"}";
String jsonVal1 = "{\"id\":5382,\"user\":\"Mary\"}";
String jsonVal2 = "{\"id\":2341,\"person\":\"Bob\"}";
Model obj0 = JSON.parseObject(jsonVal0, Model.class);
assertEquals(5001, obj0.id);
assertEquals("Jobs", obj0.name);
Model obj1 = JSON.parseObject(jsonVal1, Model.class);
assertEquals(5382, obj1.id);
assertEquals("Mary", obj1.name);
Model obj2 = JSON.parseObject(jsonVal2, Model.class);
assertEquals(2341, obj2.id);
assertEquals("Bob", obj2.name);
}
public static class Model {
public int id;
@JSONField(alternateNames = {"user", "person"})
public String name;
}
}