本文主要详细介绍一下FastJson使用@JSONField、@JSONType、SerializeFilter进行序列化。之前了解的序列化都是非定制化的,本文介绍的fastjson可以按需求进行定制化输出。
本文使用的fastjson版本为1.2.47
FastJson使用@JSONField、@JSONType、SerializeFilter进行序列化时,强调所有的操作(注解)都是在序列化和反序列化的时候起左右(并且该对象也参与其中),其它的时候不起作用(比如对象.get或.set时候没作用)
1.@JSONField
1.1@JSONField注解代码演示
这个注解可以设置的参数有:ordinal,name,format,serialize,deserialize,jsonDirect等等,后面的不常用啊
对象AAAaaa类:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100public class AAAaaa {
(name = "userName", ordinal = 2)
private String name;
private Integer age;
private String address;
(name = "userWork", ordinal = 1, serialize = false)
private String work;
(name = "userSchool", ordinal = 4, deserialize = false)
private String school;
(name = "json", ordinal = 4, jsonDirect = true)
private String studentjson;
//yyyy年MM月dd日 HH时mm分ss秒
(ordinal = 3, name = "time", format = "yyyy-MM-dd HH:mm:ss")
private Date createtime;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
(name = "userAge")
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
(name = "userAddress")
public void setAddress(String address) {
this.address = address;
}
public String getWork() {
return work;
}
public void setWork(String work) {
this.work = work;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getStudentjson() {
return studentjson;
}
public void setStudentjson(String studentjson) {
this.studentjson = studentjson;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public AAAaaa() {
}
public AAAaaa(String name, Integer age, String address, String work, String school, String studentjson, Date createtime) {
this.name = name;
this.age = age;
this.address = address;
this.work = work;
this.school = school;
this.studentjson = studentjson;
this.createtime = createtime;
}
public String toString() {
return "AAAaaa{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
", work='" + work + '\'' +
", school='" + school + '\'' +
", studentjson='" + studentjson + '\'' +
", createtime=" + createtime +
'}';
}
}
测试类:1
2
3
4
5
6
7
8
9
10
11
12
13public class TestDemo {
public static void main(String[] args) {
AAAaaa aa=new AAAaaa("xiaoming",20,"北京","英语老师","北京小学","[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]",new Date());
System.out.println(aa);
String s = JSONObject.toJSONString(aa);
//测试序列化
System.out.println(s);
//跟AAAaaa这个对象无关,所以跟@JSONField注解无关
System.out.println(JSONObject.parseObject(s));
//测试反序列化
System.out.println(JSONObject.parseObject(s,AAAaaa.class));
}
}
测试结果1
2
3
4AAAaaa{name='xiaoming', age=20, address='北京', work='英语老师', school='北京小学', studentjson='[{"studentName":"lily","studentAge":12},{"studentName":"lucy","studentAge":15}]', createtime=Tue Sep 03 17:19:12 CST 2019}
{"address":"北京","userAge":20,"userName":"xiaoming","time":"2019-09-03 17:19:12","json":[{"studentName":"lily","studentAge":12},{"studentName":"lucy","studentAge":15}],"userSchool":"北京小学"}
{"time":"2019-09-03 17:19:12","json":[{"studentName":"lily","studentAge":12},{"studentName":"lucy","studentAge":15}],"address":"北京","userSchool":"北京小学","userName":"xiaoming","userAge":20}
AAAaaa{name='xiaoming', age=null, address='null', work='null', school='null', studentjson='[{"studentName":"lily","studentAge":12},{"studentName":"lucy","studentAge":15}]', createtime=Tue Sep 03 17:19:12 CST 2019}
1.2@JSONField注解详细讲解
1)ordinal
这个值的设置,可以使对象的属性按这个顺序来输出,默认值是0,要是都不设置,那就按属性名称的字母顺序来输出(数字小的或字母在前的先输出)
2)name
直接把原来的属性名称代码,给替换成别名
3)format
这个针对日期属性,至于他的值,你可以随意设置格式化格式,前提是复合那个SimpleDateFormat这个类的格式化时间的格式就好,估计是通用的
4)serialize
序列化,默认值是true,都是序列化的,我在model里面设置了个false,然后可以看到,在输出json字符串中,这个属性对应的key和value都不见啦。就是这么个作用
5)deserialize
这个反序列化,默认值也是true,默认都是需要反序列化的,我对name属性设置是false,在字符串转对象对时候,发现对象对name属性是null啦。就是这么个作用。
6)jsonDirect
这个说是,如果对象对某个属性的值是json字符串的话,就不要在做处理啦,直接就是json。
@JSONField注解可以作用在Field字段上也可以作用在setter和getter方法上,当作用在setter方法上时,就相当于根据name到json中寻找对应的值,并调用该setter对象赋值。当作用在getter上时,在bean转换为json时,其key值为name定义的值。
2.@JSONType
可以多个属性并列放@JSONType(orders = {“name”,”work”,”address”},includes={“name”,”work”,”address”})1
2
3(orders = {"z","a","b","c","d"}) 相当于ordinal
(includes={"name","work","address"}) 相当于serialize(参与序列化的有name,work,address)
(ignores={"name","work","address"}) 不参与序列化的有name,work,address
3.SerializeFilter
3.1SerializeFilter属性使用
1)在代码中使用1
2
3
4
5JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd"; //把AAAaaa类中format = "yyyy-MM-dd HH:mm:ss"去掉
AAAaaa aa = new AAAaaa(null, 20, "北京", "英语老师", "北京小学", "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]", new Date());
String s = JSONObject.toJSONString(aa, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.WriteMapNullValue);
//测试序列化
System.out.println(s);
测试结果1
{"address":"北京","userAge":20,"userName":null,"time":"2019-09-04","json":[{"studentName":"lily","studentAge":12},{"studentName":"lucy","studentAge":15}],"userSchool":"北京小学"}
2)在@JSONField注解中使用1
2
3
4
5
6
7
8
9
10
11
12
13public class AAAaaa {
(serialzeFeatures = {SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteMapNullValue})
private String name;
private Integer age;
private String address;
private String work;
private String school;
private String studentjson;
private Date createtime;
......
}
3)在@JSONType注解中使用1
2
3
4
5
6
7
8
9
10
11
12
13(serialzeFeatures = {SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteMapNullValue})
public class AAAaaa {
private String name;
private Integer age;
private String address;
private String work;
private String school;
private String studentjson;
private Date createtime;
......
}
3.2SerializeFilter属性列表
1 | package com.alibaba.fastjson.serializer; |
相关博客链接: https://blog.csdn.net/liupeifeng3514/article/details/79166566