首先解释下java bean转化为JSONObject的过程(我之前并不知道,才会有这次bug的产生):
通过阅读源码,你会发现,json包会扫描java实体类中的所有get方法,并且把所有的getXXX()方法都执行一遍!然后在内部执行new JSONObject操作创建一个新的jsonObject对象,通过各种resolver解析器把从get中获取到的值都设置到这个jsonObject中,最后返回这个jsonObject对象。
这是我转化失败的实体类的错误部分:
//这段代码不是我写的!!!
public Class Xxbean {
private Date time;
public void setTime(Date time){
tihs.time=time;
}
public Date getTime(){
return this.time;
}
public String getDateTimeFormat(){
SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd");
return formater.format(time);
}
}
错误分析:
虽然getDateTimeFormat()方法我并没有调用过,但在转化为jsonObject时,json包会自动执行getDateTimeFormat()方法,根据驼峰命名法把dateTimeFormat当成bean一个属性字段,即自动生成一个dateTimeFormat字段设置到jsonObject中返回。 而在SimpleDateFormat格式化时间时又没有做异常处理,当time为null值时就会转化失败!然而我并没有显示地调用 getDateTimeFormat()方法 !解决方法是把这个方法删掉就好了。
总结:
1、实体类要写规范,不要写无关的getXXX方法
2、SimpleDateFormat要慎用,用时要做异常处理
3、多读源码,加强调试能力
4、遇到出bug但控制台没把错误 信息打印出来时,把日志级别调为debug级别
5、抵制不规范代码,别给后面的开发者埋雷!