Tried to assign property name

解决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也不一样。

 

欢迎一起更深入的进行探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值