fastjson 筆記

fastjson 筆記

demo代碼地址

demo/fastjson at master · suveng/demo · GitHub

fastjson 最佳實踐

如果有更好的可以聯繫作者修正,哈哈哈哈

Maven 下引入 Fastjson

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

序列化一個對象成 JSON 字符串

demo.java

	/**
	 * 序列化一個對象成JSON字符串
	 * @author suwenguang
	 * @date 2019/11/6
	 */
	public String ObjToJsonString(){
		Human human = new Human();
		human.setBody("good");
		human.setSpirit("上天");
		human.setBirthday(new Date());
		human.setAge(22L);
		ArrayList<Human> famaily = new ArrayList<>();
		for (int i = 0; i < 5; i++) {
			Human member = new Human();
			member.setBody("good");
			member.setSpirit("上天");
			member.setBirthday(new Date());
			member.setAge(22L);
			famaily.add(member);
		}
		human.setFamaily(famaily);
		return JSON.toJSONString(human);
	}

hunman.java

@Data
public class Human {

	/**
	 * 身體
	 */
	private String body;

	/**
	 * 精神
	 */
	private  String spirit;

	/**
	 * 出生日期
	 */
	private Date birthday;

	/**
	 * 年齡
	 */
	private Long age;

	/**
	 * 家庭
	 */
	private List<Human> famaily;
}

結果

{
    "age": 22,
    "birthday": 1573007531738,
    "body": "good",
    "famaily": [
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        },
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        },
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        },
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        },
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        }
    ],
    "spirit": "上天"
}

反序列化一個 JSON 字符串成 Java 對象

demo.java
使用剛剛的序列化字符串做 反序列化

   /**
	 * 反序列化字符串到java對象
	 * @author suwenguang
	 * @date 2019/11/6
	 */
	public Human stringToObject(){
		String json = "{\n" +
			"    \"age\": 22,\n" +
			"    \"birthday\": 1573007531738,\n" +
			"    \"body\": \"good\",\n" +
			"    \"famaily\": [\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        },\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        },\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        },\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        },\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        }\n" +
			"    ],\n" +
			"    \"spirit\": \"上天\"\n" +
			"}";
		return JSON.parseObject(json, Human.class);
	}

結果

日期格式處理

  1. 特殊字段處理 @JsonField
  2. 全局處理 FastJsonConfig

特殊字段配置

字段註解配置


	/**
	 * 出生日期
	 */
	@JSONField(format = "yyyy-MM")
	private Date birthday;

結果

{
    "age": 22,
    "birthday": "2019-11",
    "body": "good",
    "famaily": [
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" }
    ],
    "spirit": "上天"
}

全局配置

使用 JsonField 配置日期格式,被 FastJsonConfig 的全局配置覆蓋掉 · Issue #1868 · alibaba/fastjson · GitHub

SerializerFeature 屬性使用

SerializerFeature 屬性使用

使用

  1. 手動使用
  2. 全局配置

JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

屬性解釋

名稱 含義
QuoteFieldNames 輸出 key 時是否使用雙引號,默認爲 true
SkipTransientField 如果是 true,類中的 Get 方法對應的 Field 是 transient,序列化時將會被忽略。默認爲 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
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
BeanToArray 將對象轉爲 array 輸出

屬性過濾器

SerializeFilter 是通過編程擴展的方式定製序列化。Fastjson 支持 6 種 SerializeFilter,用於不同場景的定製序列化。

  • PropertyPreFilter:根據 PropertyName 判斷是否序列化
  • PropertyFilter:根據 PropertyName 和 PropertyValue 來判斷是否序列化
  • NameFilter:修改 Key,如果需要修改 Key,process 返回值則可
  • ValueFilter:修改 Value
  • BeforeFilter:序列化時在最前添加內容
  • AfterFilter:序列化時在最後添加內容

自定義序列化與反序列化

自定義序列化

  1. 實現 ObjectSerializer
  2. 註冊 ObjectSerializer

自定義反序列化

  1. 自定義實現 ObjectDeserializer
  2. 註冊並使用 ObjectDeserializer

JSON 最佳實踐 | kimmking’s blog

解決 FastJson 中“$ref 循環引用”的問題

解決 FastJson 中“$ref 循環引用”的問題

解決: 關閉循環依賴檢測 DisableCircularReferenceDetect

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章