最近在项目中遇到了一个问题,在打印日志的时候,使用了一个统一封装的框架,将一个对象A打出来。结果确发现在日志里打出来的这个对象有一些本来不应该有的值。而直接print这个对象的时候(调用对象自身的 toString()方法),是没有这个问题的。一直都不知道为什么,还是玉洋帮我debug出来了。

用我们统一的框架打一个对象的时候,最后默认调用的是FastJson的JSON.toJSONString()方法来讲一些参数输出。这个时候,并不是将对象的所有域都输出,而是用反射的方式,找到对象类的所有getter 方法,然后去掉其get,首位转小写,认为这是一个field,这个field的值是当前getter方法返回的结果,导致了上述情况的发生。

要避免上述情况的发生,可以在方法上增加一个注解@JSONField(serialize=false) ,这样就不会序列化这个getter方法对应的域。

后面又查了一下相关的资料,发现Jackson也有类似的问题,而Google的gson是没有这个问题的,以后可以在项目里多尝试使用gson。