fastjson与JavaBean

测试类:Student.java

  1. public class Student {
  2. private String name;
  3. public int age;
  4. public Student() {
  5. System.out.println("无参构造函数被调用!");
  6. }
  7. public String getName() {
  8. System.out.println("getName method called!");
  9. return name;
  10. }
  11. public void setName(String name) {
  12. System.out.println("setName method called!");
  13. this.name = name;
  14. }
  15. }

测试代码:

  1. import com.alibaba.fastjson.JSON;
  2. public class Ser {
  3. public static void main(String[] args){
  4. Student student = new Student();
  5. student.age = 19;
  6. student.setName("l0nm4r");
  7. String jsonstring = JSON.toJSONString(student);
  8. System.out.println(jsonstring);
  9. System.out.println(JSON.parse(jsonstring));
  10. JSON.parseObject(jsonstring,Student.class);
  11. }
  12. }

执行结果:

  1. 无参构造函数被调用!
  2. setName method called!
  3. getName method called!
  4. {"age":19,"name":"l0nm4r"}
  5. {"name":"l0nm4r","age":19}
  6. 无参构造函数被调用!
  7. setName method called!

结论:

  1. 在调用 JSON.toJSONString 方法时, 会自动调用类实例的getter方法, 获取JavaBean属性
  2. 在调用JSON.parseObject时,会自动调用类的无参构造方法,然后通过setter设置JavaBean的属性值.

另外根据文档还要一些列的Filter可以在反序列化和序列化的时候修改key或者Value的值.
如NameFilter, ContextValueFilter等.
还可以为JSON.toJSONString指定属性值,如SerializerFeature.WriteClassName,
这样序列化的结果会多一个@type的键, 如:
image.png
显然这个@type的键值即为序列化的类. 这样在反序列化的时候会根据这个值调用对应类的getter和setter等方法.(如下图JSON.parse返回的是Student对象)
image.png

反序列化

反序列化有两种方式JSON.parseObject和JSON.parse.
看到parseObject方法的实现,和parse的区别只是在多调用了一个toJSON方法.
image.png
使用上的区别:

  1. JSON.parse: ```java import com.alibaba.fastjson.JSON;

public class Ser { public static void main(String[] args) { System.out.println(JSON.parse(“{\”name\”:\”l0nm4r\”,\”age\”:19}”)); // {“age”:19,”name”:”l0nm4r”} System.out.println(JSON.parse(“{\”@type\”:\”Student\”,\”name\”:\”l0nm4r\”,\”age\”:\”19\”}”)); // 无参构造函数被调用! // setName method called! // Student@56dfb22b } }

  1. 2. JSON.parseObject
  2. ```java
  3. import com.alibaba.fastjson.JSON;
  4. public class Ser {
  5. public static void main(String[] args) {
  6. System.out.println(JSON.parseObject("{\"name\":\"l0nm4r\",\"age\":19}"));
  7. // {"age":19,"name":"l0nm4r"}
  8. System.out.println(JSON.parseObject("{\"@type\":\"Student\",\"name\":\"l0nm4r\",\"age\":\"19\"}"));
  9. // 无参构造函数被调用!
  10. // setName method called!
  11. // getName method called!
  12. // {"name":"l0nm4r","age":19}
  13. }
  14. }