fastJson、JackJson以及Gson序列化对象与get、set以及对象属性之间的关系

       众所周知,平时开发过程中将对象序列化成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()有关,可以自己试一下其它类型的属性。

 

 

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
当涉及到复杂对象的反序列化时,Fastjson同样提供了相应的方法来处理。复杂对象通常包含嵌套的对象、集合或数组。下面是一个示例代码,演示了如何使用Fastjson进行复杂对象的反序列化: ```java import com.alibaba.fastjson.JSON; public class FastjsonDemo { public static void main(String[] args) { String jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\",\"pets\":[{\"name\":\"Tom\",\"age\":2},{\"name\":\"Jerry\",\"age\":1}]}"; // 反序列化 Person person = JSON.parseObject(jsonStr, Person.class); System.out.println(person.getName()); // 输出:John System.out.println(person.getAge()); // 输出:30 System.out.println(person.getCity()); // 输出:New York for (Pet pet : person.getPets()) { System.out.println(pet.getName()); // 输出:Tom,Jerry System.out.println(pet.getAge()); // 输出:2,1 } } } class Person { private String name; private int age; private String city; private List<Pet> pets; // 省略构造器、getter和setter方法 } class Pet { private String name; private int age; // 省略构造器、getter和setter方法 } ``` 在上面的示例中,我们将一个包含嵌套对象JSON字符串反序列化为一个Person对象。Person类中包含了一个List类型的pets字段,pets字段是一个包含了多个Pet对象的集合。通过调用`JSON.parseObject()`方法Fastjson会自动将JSON字符串中的嵌套对象转换为相应的Java对象。 需要注意的是,Fastjson在处理嵌套对象时需要保证嵌套对象的类结构与JSON字符串的结构相匹配,即字段名和类型要一致。否则,可以使用`@JSONField`注解来进行映射或者使用`TypeReference`类来处理复杂泛型类型。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值