FastJson使用@JSONField、@JSONType、SerializeFilter进行序列化时,强调所有的操作(注解)都是在序列化和反序列化的时候起左右(并且该对象也参与其中),其它的时候不起作用(比如对象.get或.set时候没作用)
1.@JSONField 代码演示
package com.example.springbootannotationdemo.testjson;
import com.alibaba.fastjson.annotation.JSONField;
import java.util.Date;
@Getter
@Setter
public class BizApDevice {
@JSONField(ordinal = 4)
private String sheetType;
@JSONField(name = "bandwidthRate", ordinal = 2)
private String bandWidth;
@JSONField(name = "id", ordinal = 1)
private String linkedWorkerInfo;
@JSONField(ordinal = 0, name = "time", format = "yyyy-MM-dd HH:mm:ss")
private Date createdTime;
public BizApDevice(String sheetType, String bandWidth, String linkedWorkerInfo,
Date createdTime) {
this.sheetType = sheetType;
this.bandWidth = bandWidth;
this.linkedWorkerInfo = linkedWorkerInfo;
this.createdTime = createdTime;
}
@Override
public String toString() {
return "BizApDevice{" + "sheetType='" + sheetType + '\'' + ", bandWidth=" + bandWidth
+ ", linkedWorkerInfo='" + linkedWorkerInfo + '\'' + ", createdTime='" + createdTime
+ '}';
}
}
测试代码如下:
package com.example.springbootannotationdemo.testjson;
import java.util.Date;
import com.alibaba.fastjson.JSONObject;
/**
* @Type JsonSerizableTest
* @Desc
* @Author hushuwei
* @Date 2020-01-09 17:50
* @Version
*/
public class JsonSerizableTest {
public static void main(String[] args) {
BizApDevice bizApDevice = new BizApDevice("110", "1000bps", "123", new Date());
System.out.println("序列化前的model toString method:" + bizApDevice);
String deviceJsonStr = JSONObject.toJSONString(bizApDevice);
System.out.println("序列化后的jsonString:" + deviceJsonStr);
System.out.println(JSONObject.parseObject(deviceJsonStr,BizApDevice.class));
String preDeSerializerStr = "{\"bandwidthRate\":\"1000bps\",\"createdTime\":1578563917986,\"id\":\"123\",\"sheetType\":\"110\"}";
System.out.println(JSONObject.parseObject(preDeSerializerStr,BizApDevice.class));
BizApDevice testSerializerFeature = new BizApDevice("111","100M",null,new Date(
));
// test SerializerFeature
System.out.println(JSONObject.toJSONString(testSerializerFeature, SerializerFeature.WriteMapNullValue));
System.out.println(JSONObject.toJSONString(testSerializerFeature, SerializerFeature.PrettyFormat));
}
}
返回结果:
序列化前的model toString method:BizApDevice{sheetType='110', bandWidth=1000bps, linkedWorkerInfo='123', createdTime='Fri Jan 10 13:06:11 CST 2020}
序列化后的jsonString:{"time":"2020-01-10 13:06:11","id":"123","bandwidthRate":"1000bps","sheetType":"110"}
BizApDevice{sheetType='110', bandWidth=1000bps, linkedWorkerInfo='123', createdTime='Fri Jan 10 13:06:11 CST 2020}
BizApDevice{sheetType='110', bandWidth=1000bps, linkedWorkerInfo='123', createdTime='null}
{"time":"2020-01-10 13:06:11","id":null,"bandwidthRate":"100M","sheetType":"111"}
{
"time":"2020-01-10 13:06:11",
"bandwidthRate":"100M",
"sheetType":"111"
}
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定义的值。
3 .SerializerFeature
名称 含义 备注
QuoteFieldNames 输出key时是否使用双引号,默认为true
UseSingleQuotes 使用单引号而不是双引号,默认为false
WriteMapNullValue 是否输出值为null的字段,默认为false
WriteEnumUsingToString Enum输出name()或者original,默认为false
UseISO8601DateFormat Date使用ISO8601格式输出,默认为false
WriteNullListAsEmpty List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty 字符类型字段如果为null,输出为”“,而非null
WriteNullNumberAsZero 数值字段如果为null,输出为0,而非null
WriteNullBooleanAsFalse Boolean字段如果为null,输出为false,而非null
SkipTransientField 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
SortField 按字段名称排序后输出。默认为false
WriteTabAsSpecial 把\t做转义输出,默认为false 不推荐
PrettyFormat 结果是否格式化,默认为false
WriteClassName 序列化时写入类型信息,默认为false。反序列化是需用到
DisableCircularReferenceDetect 消除对同一对象循环引用的问题,默认为false
WriteSlashAsSpecial 对斜杠’/’进行转义
BrowserCompatible 将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
WriteDateUseDateFormat 全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
DisableCheckSpecialChar 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
NotWriteRootClassName 含义
BeanToArray 将对象转为array输出
WriteNonStringKeyAsString 含义
NotWriteDefaultValue 含义
BrowserSecure 含义
IgnoreNonFieldGetter 含义
WriteEnumUsingName 含义