FastJson 使用@JSONField & SerializerFeature

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  含义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值