7
涉及的类:com.alibaba.fastjson.util.TypeUtils.fnv1a_64_lower()
问题描述:升级fastjson版本号后对含_的key无法正常反序列化比如我有一个如下的类:
class Person {
@JSONField(name="person_name")
private String personName;
public String getPersonName() {
return personName;
}
public void setPersonName(String personName) {
this.personName = personName;
}
}
进行如下反序列化时:
Person a = JsonUtil.fromJson("{\"person_name\":\"zhoudapeng\"}",Person.class);
Person b = JsonUtil.fromJson("{\"personName\":\"zhoudapeng\"}",Person.class);
结果如下 | 版本 | a的personName | b的personName |
---|---|---|---|
1.2.70 | zhoudapeng | zhoudapeng | |
1.2.76 | zhoudapeng | null |
fastjson有智能匹配的功能,推测是此处逻辑有改动导致的
源码分析老版本实现:
public static long fnv1a_64_lower(String key){
long hashCode = 0xcbf29ce484222325L;
for(int i = 0; i < key.length(); ++i){
char ch = key.charAt(i);
// 老版本遇到_和-会直接跳过,所以json字符串里即使key里面含有下划线或者-也能正常反序列化成驼峰,比如 {"a_b":"xxx"} 的字符串反序列化时可用 ab,aB来接
if(ch == '_' || ch == '-'){
continue;
}
if(ch >= 'A' && ch <= 'Z'){
ch = (char) (ch + 32);
}
hashCode ^= ch;
hashCode *= 0x100000001b3L;
}
return hashCode;
}
新版本实现:
public static long fnv1a_64_lower(String key){
long hashCode = 0xcbf29ce484222325L;
for(int i = 0; i < key.length(); ++i){
char ch = key.charAt(i);
<font color='red'>// 新版本对-和_的特殊处理被取消了</font>
if(ch >= 'A' && ch <= 'Z'){
ch = (char) (ch + 32);
}
hashCode ^= ch;
hashCode *= 0x100000001b3L;
}
return hashCode;
}