JSON字符串: {"__status":"sdas"}
java对象为:
public class TestJson {
private Boolean status;
// get set 省略...
}
调用方法为JSON.parseObject(json, TestJson.class);
当JSON的key和Java实体属性名称不一样应该忽略,但是实际上没有忽略,并解析成了status 导致类型转换出现问题。
查看源码发现JavaBeanDeserializer类中的smartMatch()函数体里出现了问题
其中发现在使用TypeUtils工具类发现会把key的下划线忽略掉
long smartKeyHash = TypeUtils.fnv1a_64_lower(key);
源码如下
public static long fnv1a_64_lower(String key){
long hashCode = 0xcbf29ce484222325L;
for(int i = 0; i < key.length(); ++i){
char ch = key.charAt(i);
if(ch == '_' || ch == '-'){
continue;
}
if(ch >= 'A' && ch <= 'Z'){
ch = (char) (ch + 32);
}
hashCode ^= ch;
hashCode *= 0x100000001b3L;
}
return hashCode;
}
不知道是否真存在这个问题,希望能得到一个好的答复,谢谢!