众所周知,平时开发过程中将对象序列化成json字符串常用的工具类一般就三种:fastJson、Gson、Jackjson,但是三种工具类在将对象进行序列化时与对象的get、set、对象属性之间的关系你知道吗,如果知道了,那么下面的你没必要看了,不知道的话请继续看下去。
1.与对象属性之间的关系
为了区分三者之间的关系,我创建了一个测试类,只有一个success属性,没有get、set方法,默认值为false,可以看出,gson的序列化结果是{"success":false},fastJson的结果是{},jackJson直接报错,由此可以得出结论:Gson是通过反射遍历该类中的所有属性,并把其值序列化成json,至于FastJson和JackJson的序列化跟属性暂时看不出来关系。
2.与对象的set方法之间的关系
为了测试跟set方法的关系,我在测试类中给该属性加了一个set方法,运行的结果显示跟上面的一样,可以猜想跟set方法没关系,但是有的人可能会说,有可能通过反射遍历出该类中的所有setter方法,得到setSuccess,然后根据JavaBeans规则,获取测试类的属性,然后序列化成json,跟直接通过属性序列化的结果一样,因此只展示一个。因此我又在测试类中加了一个setTestSuccess方法,结果如下:
运行的结果显示跟上面的一样,并没有多出任何结果,因此得出结论:三个工具类的序列化结果跟类的set方法没有关系。
3.与对象的get方法之间的关系
为了测试与get方法的关系,我加上了success属性的get方法,有人可能会说,不应该是getSuccess(),怎么是isSuccess()方法,具体原因请看我的博客《关于boolean类型的数据不推荐使用isXXX命名的那些事》,这里大致说一声,boolean类型的数据,其get方法默认就是isXXX(),不是getXXX(),这是规定的。
从结果可以出,Gson序列化后的结果不变,而JackJson和FastJson不再报错,而是出现了结果,跟Gson序列化的结果一样,因此可以猜想JackJson和FastJson序列化结果跟get方法有关系,而Gson序列化的结果跟get方法有没有关系还不确定。因此我们还得再加一个get方法和一个isXXX()方法来测试,测试结果如下:
我在测试类中又加了一个isSuccessSecond()和getAuthorName(),结果发现gson序列化的结果还是不变的,但是jackJson和fastJson序列化的结果中多了两个值authorName和successSecond。
因此可以得出结论:fastjson和jackson在把对象序列化成json字符串的时候,是通过反射遍历出该类中的所有getter方法,得到getAuthorName和isSuccessSecond,然后根据JavaBeans规则,他会认为这是两个属性authorName和successSecond的值,直接序列化成json。
综上所述:Gson是通过反射遍历该类中的所有属性,并把其值序列化成json字符串;JackJson和fastJson是通过getter方法获取属性,并把其值序列化成json字符串。
三者的序列化都跟setter()没有任何关系,至于单个测试属性,setter方法、getter方法,我都试过,这里就不一一贴出来代码,想测试的大兄弟们可以自己测试,若有问题,请及时反馈。可能有人说跟isXXX()有关,其实是跟get方法有关,主要是boolean类型的属性,其get方法默认都是isXXX,Boolean类型的属性,其get方法还是getXXX(),感兴趣的同学可以看一下我的博客《关于boolean类型的数据不推荐使用isXXX命名的那些事》。如果还是认为跟isXXX()有关,可以自己试一下其它类型的属性。