解决json转成java对象是出现的Tried to assign property name问题。
JSONObject jsonData1=JSONObject.fromObject(data1)
jsonData1对象,由JSONObject.fromObject(data1)将传入的json字符串生成。data1是外部传入的字符串
Frate frate=(Frate)JSONObject.toBean(jsonData1, Frate.class);
接着就是将生成的外部的jsonObject对应具体的实体对象,调用JSONObject.toBean(jsonData1, Frate.class);
Frate是定义好的java类。
在JSONObject.toBean方法中要做的就是将外部的传入的json格式的对象的属性和值,赋值给Java对象。
这里主要讲如何对的java对象的属性赋值
在这个Introspector类中发现了属性名的解析的方法
public static String decapitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
// 属性名大于1且前两个字符都是大写,就会直接返回该属性名,就是在这里出的问题
// 比如有一个fBuyPri的属性,用lombok生成的set/get方法是setFBuypri(),
// 结果在这里就返回了FBuypri作为类的属性,而外部传来的json中的字段则是fBuypri,
// 这样json的字段和值就与java对象中的字段匹配不上,结果这个字段就是null或者结果为0(由字段类型的初始值决定)
// 解决方法就是重写,这样字段的set/get方法,写成setfBuypri()就好了
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
Character.isUpperCase(name.charAt(0))){
return name;
}
// 一般的属性名走下面的分支,会把首字母转成小写然后返回该属性名
char chars[] = name.toCharArray();
chars[0] = Character.toLowerCase(chars[0]);
return new String(chars);
}
// 上面的入参name是根据set/get方法,截取第三个字符之后,也就是把set/get去掉后的字符串。或者如果是不是get/get而是is类的判断,则截取两个字符之后。这这样得到的一个name传入的。
有个疑问,为不直接拿类的属性,而是要根据set/get方法来
Method methodList[] = getPublicDeclaredMethods(beanClass);
因为安全性考虑,只对public声明的方法进行赋值。
processPropertyDescriptors() 这个方法对set/get进行合并
如果setMethod/getMethod方法的Method的值不一致,那么就会产生俩PropertyDescriptor用来分别描述这俩方法方法,他们的BaseName也不一样。
欢迎一起更深入的进行探讨。