fastjson自定義序列化竟然有這么多姿勢?


本文介紹下fastjson自定義序列化的各種操作。

一、什么是fastjson?

fastjson是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字符串,支持將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean。

二、如何使用

添加如下maven依賴即可:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.60</version>
</dependency>

三、fastjson默認序列化

fastjson入口類是com.alibaba.fastjson.JSON,一個最簡單默認的序列化代碼如下:

User user = new User();
String str= JSON.toJSONString(user);

四、如何自定義序列化

fastjson支持多種方式自定義序列化。

1.使用序列化屬性SerializerFeature

SerializerFeature常用屬性如下:

名稱 含義
WriteNonStringKeyAsString 如果key不為String,則轉換為String
WriteNonStringValueAsString 如果value不為String,則轉換為String
WriteMapNullValue 輸出為空的字段
WriteNullStringAsEmpty String為null時輸出""
WriteNullNumberAsZero number為null時輸出0
WriteDateUseDateFormat 修改日期格式,yyyy-MM-dd

常用的屬性介紹完了,咱們先來看下效果,新建一個User類,代碼如下:

@Data
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private Integer age;

    private String name;

    private String sex;

    private Date createDate;

    private Map<Integer, Integer> dataMap;

}

運行類代碼如下:

public static void main(String[] args) {
        User user = new User();
        user.setId(1000);
        user.setName("Java碎碎念");
        user.setCreateDate(new Date());

        Map<Integer, Integer> datamap = new HashMap<>();
        datamap.put(1, 100);
        datamap.put(2, 200);
        user.setDataMap(datamap);

        System.out.println("默認序列化結果:\n" + JSON.toJSONString(user));
        System.out.println("指定WriteNonStringKeyAsString序列化結果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNonStringKeyAsString));
        System.out.println("指定WriteNonStringValueAsString序列化結果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNonStringValueAsString));
        System.out.println("指定WriteMapNullValue序列化結果:\n" + JSON.toJSONString(user, SerializerFeature.WriteMapNullValue));
        System.out.println("指定WriteNullStringAsEmpty序列化結果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty));
        System.out.println("指定WriteNullNumberAsZero序列化結果:\n" + JSON.toJSONString(user, SerializerFeature.WriteNullNumberAsZero));
        System.out.println("指定WriteDateUseDateFormat序列化結果:\n" + JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat));
    }

運行結果:

默認序列化結果:
{"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
指定WriteNonStringKeyAsString序列化結果:
{"createDate":1575038247084,"dataMap":{"1":100,"2":200},"id":1000,"name":"Java碎碎念"}
指定WriteNonStringValueAsString序列化結果:
{"createDate":1575038247084,"dataMap":{1:"100",2:"200"},"id":"1000","name":"Java碎碎念"}
指定WriteMapNullValue序列化結果:
{"age":null,"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念","sex":null}
指定WriteNullStringAsEmpty序列化結果:
{"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念","sex":""}
指定WriteNullNumberAsZero序列化結果:
{"age":0,"createDate":1575038247084,"dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}
指定WriteDateUseDateFormat序列化結果:
{"createDate":"2019-11-29 22:37:27","dataMap":{1:100,2:200},"id":1000,"name":"Java碎碎念"}

2.使用JSONField

JSONField是fastjson的一個注解,可以用在字段上,也可以用在getter/setter方法上面。

2.1 JSONField注解

注解主要內容如下:

package com.alibaba.fastjson.annotation;

public @interface JSONField {
    // 配置序列化和反序列化的順序,1.1.42版本之后才支持
    int ordinal() default 0;

     // 指定字段的名稱
    String name() default "";

    // 指定字段的格式,對日期格式有用
    String format() default "";

    // 是否序列化
    boolean serialize() default true;

    // 是否反序列化
    boolean deserialize() default true;
}

2.2 JSONField注解配置方式

  • 配置在字段上
@Data
public class User implements Serializable {

    @JSONField(name = "_id")
    private Integer id;
}
  • 配置在getter/setter上
    @JSONField(name="_id")
    public Integer getId() {
        return id;
    }

    @JSONField(name="_id")
    public void setId(Integer id) {
        this.id = id;
    }

  • 使用format配置日期格式化
    @JSONField(format="yyyy-MM-dd")
    private Date createDate;
  • 使用serialize/deserialize指定字段不序列化
    @JSONField(serialize=false)
    private Integer age;
  • 使用ordinal指定字段的順序
@JSONField(ordinal = 2)
    private String name;

下面直接修改代碼看下效果,修改后User類如下:

@Data
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @JSONField(name = "_id", ordinal = 3)
    private Integer id;

    @JSONField(serialize = false, ordinal = 4)
    private Integer age;

    @JSONField(ordinal = 1)
    private String name;

    @JSONField(ordinal = 2)
    private String sex;

    @JSONField(format = "yyyy-MM-dd", ordinal = 5)
    private Date createDate;
}

測試類運行結果如下:

默認序列化結果:
{"age":18,"createDate":1575006127174,"id":1000,"name":"Java碎碎念"}
使用JSONField后序列化結果:
{"name":"Java碎碎念","_id":1000,"createDate":"2019-11-29"}

通過運行結果可以看到,使用@JSONField注解變化如下:

  • id序列化后變成了_id
  • createDate格式化為yyyy-MM-dd
  • 序列化后字段的順序跟ordinal指定的一致
  • 設置了serialize=false的字段age沒有序列化

結果和預期一致,說明自定義序列化沒有問題,到此fastjson自定義序列化的功能已經全部實現,有問題歡迎留言溝通哦!

推薦閱讀

1.SpringBoot2.0整合集成WebSocket,實現后端數據實時推送!

2.一分鍾帶你了解下MyBatis的動態SQL!

3.一分鍾帶你了解下Spring Security!

4.一分鍾帶你學會利用mybatis-generator自動生成代碼!

5.手把手帶你實戰下Spring的七種事務傳播行為

限時領取免費Java相關資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高並發分布式、大數據、機器學習等技術。
關注下方公眾號即可免費領取:

Java碎碎念公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM