一、demo代码
@JSONField注解属性字段上与set、get方法上。使用@Data注解(lombok插件安装最下方),对属性“笔名”【pseudonym】手动重写setter/getter方法
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data; @Data
public class Stu { private String name;
//下划线自动转换
private String alias_name; //下划线自动转换
// @JSONField(name="pen_name")
private String penName; //实体类转为json,使用注解name值
@JSONField(name="pen_name2")
private String penName2; private String pseudonym; //实体类转为json,使用注解name值
@JSONField(name="pseud")
//不使用注解为属性名{"penName":"333","name":"1111","alias_name":"222","pen_name2":"444","pseudonym":"555"}
public String getPseudonym() {
return pseudonym;
} //json转为实体类,使用注解name值
@JSONField(name="pseudo")
public void setPseudonym(String pseudonym) {
this.pseudonym = pseudonym;
} public static void main(String[] args) {
String json = "{'name':'1111','aliasName':'222','pen_name':'333','pen_name2':'444','pseudo':'555'}";
Stu stu = JSON.parseObject(json, Stu.class); System.out.println(stu);
System.out.println(JSONObject.toJSON(stu));
}
}
二、main方法运行结果(控制台)
Stu(name=1111, alias_name=222, penName=333, penName2=444, pseudonym=555)
{"pseud":"555","penName":"333","name":"1111","alias_name":"222","pen_name2":"444"} Process finished with exit code 0
三、@Data备注
idea安装lombok插件。
四、源码
类:
JavaBeanDeserializer implements ObjectDeserializer
public FieldDeserializer smartMatch(String key, int[] setFlags) {
if (key == null) {
return null;
} else {
FieldDeserializer fieldDeserializer = this.getFieldDeserializer(key, setFlags);
if (fieldDeserializer == null) {
long smartKeyHash = TypeUtils.fnv1a_64_lower(key);
if (this.smartMatchHashArray == null) {
long[] hashArray = new long[this.sortedFieldDeserializers.length]; for(int i = ; i < this.sortedFieldDeserializers.length; ++i) {
hashArray[i] = TypeUtils.fnv1a_64_lower(this.sortedFieldDeserializers[i].fieldInfo.name);
} Arrays.sort(hashArray);
this.smartMatchHashArray = hashArray;
} int pos = Arrays.binarySearch(this.smartMatchHashArray, smartKeyHash);
boolean is = false;
if (pos < && (is = key.startsWith("is"))) {
smartKeyHash = TypeUtils.fnv1a_64_lower(key.substring());
pos = Arrays.binarySearch(this.smartMatchHashArray, smartKeyHash);
} if (pos >= ) {
if (this.smartMatchHashArrayMapping == null) {
short[] mapping = new short[this.smartMatchHashArray.length];
Arrays.fill(mapping, (short)-); for(int i = ; i < this.sortedFieldDeserializers.length; ++i) {
int p = Arrays.binarySearch(this.smartMatchHashArray, TypeUtils.fnv1a_64_lower(this.sortedFieldDeserializers[i].fieldInfo.name));
if (p >= ) {
mapping[p] = (short)i;
}
} this.smartMatchHashArrayMapping = mapping;
} int deserIndex = this.smartMatchHashArrayMapping[pos];
if (deserIndex != - && !isSetFlag(deserIndex, setFlags)) {
fieldDeserializer = this.sortedFieldDeserializers[deserIndex];
}
} if (fieldDeserializer != null) {
FieldInfo fieldInfo = fieldDeserializer.fieldInfo;
if ((fieldInfo.parserFeatures & Feature.DisableFieldSmartMatch.mask) != ) {
return null;
} Class fieldClass = fieldInfo.fieldClass;
if (is && fieldClass != Boolean.TYPE && fieldClass != Boolean.class) {
fieldDeserializer = null;
}
}
} return fieldDeserializer;
}
}
“_”下划线及“-”短横线(减号),大小写都可以智能匹配。
类:
TypeUtils
public static long fnv1a_64_lower(String key) {
long hashCode = -3750763034362895579L; for(int i = ; i < key.length(); ++i) {
char ch = key.charAt(i);
if (ch != '_' && ch != '-') {
if (ch >= 'A' && ch <= 'Z') {
ch = (char)(ch + );
} hashCode ^= (long)ch;
hashCode *= 1099511628211L;
}
} return hashCode;
}