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
```java
import 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}
}
}