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);
}
結果
日期格式處理
- 特殊字段處理
@JsonField
- 全局處理 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 屬性使用
使用
- 手動使用
- 全局配置
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:序列化時在最後添加內容
自定義序列化與反序列化
自定義序列化
- 實現 ObjectSerializer
- 註冊 ObjectSerializer
自定義反序列化
- 自定義實現 ObjectDeserializer
- 註冊並使用 ObjectDeserializer
解決 FastJson 中“$ref 循環引用”的問題
解決: 關閉循環依賴檢測 DisableCircularReferenceDetect