fastjson与JavaBean
测试类:Student.java
public class Student {private String name;public int age;public Student() {System.out.println("无参构造函数被调用!");}public String getName() {System.out.println("getName method called!");return name;}public void setName(String name) {System.out.println("setName method called!");this.name = name;}}
测试代码:
import com.alibaba.fastjson.JSON;public class Ser {public static void main(String[] args){Student student = new Student();student.age = 19;student.setName("l0nm4r");String jsonstring = JSON.toJSONString(student);System.out.println(jsonstring);System.out.println(JSON.parse(jsonstring));JSON.parseObject(jsonstring,Student.class);}}
执行结果:
无参构造函数被调用!setName method called!getName method called!{"age":19,"name":"l0nm4r"}{"name":"l0nm4r","age":19}无参构造函数被调用!setName method called!
结论:
- 在调用 JSON.toJSONString 方法时, 会自动调用类实例的getter方法, 获取JavaBean属性
- 在调用JSON.parseObject时,会自动调用类的无参构造方法,然后通过setter设置JavaBean的属性值.
另外根据文档还要一些列的Filter可以在反序列化和序列化的时候修改key或者Value的值.
如NameFilter, ContextValueFilter等.
还可以为JSON.toJSONString指定属性值,如SerializerFeature.WriteClassName,
这样序列化的结果会多一个@type的键, 如:
显然这个@type的键值即为序列化的类. 这样在反序列化的时候会根据这个值调用对应类的getter和setter等方法.(如下图JSON.parse返回的是Student对象)
反序列化
反序列化有两种方式JSON.parseObject和JSON.parse.
看到parseObject方法的实现,和parse的区别只是在多调用了一个toJSON方法.
使用上的区别:
- 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 } }
2. JSON.parseObject```javaimport com.alibaba.fastjson.JSON;public class Ser {public static void main(String[] args) {System.out.println(JSON.parseObject("{\"name\":\"l0nm4r\",\"age\":19}"));// {"age":19,"name":"l0nm4r"}System.out.println(JSON.parseObject("{\"@type\":\"Student\",\"name\":\"l0nm4r\",\"age\":\"19\"}"));// 无参构造函数被调用!// setName method called!// getName method called!// {"name":"l0nm4r","age":19}}}
