FastJson 設定預設引數
阿新 • • 發佈:2020-12-13
FastJson 屬性為空轉json字串
在實際專案中,往往使用Json傳遞引數,若物件屬性為null,轉Json字串會預設去掉該屬性,服務端強校驗會出錯。
1.POM 檔案
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
2.User物件
public class User implements Serializable {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "name: "+name+" address: "+address;
}
}
3.測試json字串
3.1 正常轉換
public static void main(String[] args) {
// String data = "{\"name\":\"sk\",\"address\":null}";
// JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask();
// User user = JSON.parseObject(data, User.class);
User user = new User();
user.setName("xxx");
System.out.println(user);
String s = JSON.toJSONString(user);
System.out.println(s);
}
結果如下:缺少了address屬性
3.2 強制所有屬性都轉換
傳入引數 SerializerFeature.WriteMapNullValue
public static void main(String[] args) {
// String data = "{\"name\":\"sk\",\"address\":null}";
// JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask();
// User user = JSON.parseObject(data, User.class);
User user = new User();
user.setName("xxx");
System.out.println(user);
String s = JSON.toJSONString(user,SerializerFeature.WriteMapNullValue);
System.out.println(s);
}
結果如下: address屬性為空也轉成json字串
注意:
這種方式也要在所有轉json的地方都要傳入這個引數,需要改動量大,我們可以考慮設定一個全域性的變數:
public static void main(String[] args) {
// 全域性變數
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask();
User user = new User();
user.setName("xxx");
System.out.println(user);
String s = JSON.toJSONString(user);
System.out.println(s);
}
結果如下:
總結:
FastJSON全域性配置說明
- SerializerFeature.PrettyFormat:格式化輸出
- SerializerFeature.WriteMapNullValue:是否輸出值為null的欄位,預設為false
- SerializerFeature.DisableCircularReferenceDetect:消除迴圈引用
- SerializerFeature.WriteNullStringAsEmpty:將為null的欄位值顯示為""
- WriteNullListAsEmpty:List欄位如果為null,輸出為[],而非null
- WriteNullNumberAsZero:數值欄位如果為null,輸出為0,而非null
- WriteNullBooleanAsFalse:Boolean欄位如果為null,輸出為false,而非null
- SkipTransientField:如果是true,類中的Get方法對應的Field是transient,序列化時將會被忽略。預設為true
- SortField:按欄位名稱排序後輸出。預設為false
- WriteDateUseDateFormat:全域性修改日期格式,預設為false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
- BeanToArray:將物件轉為array輸出
- QuoteFieldNames:輸出key時是否使用雙引號,預設為true
- UseSingleQuotes:輸出key時使用單引號而不是雙引號,預設為false(經測試,這裡的key是指所有的輸出結果,而非key/value的key,而是key,和value都使用單引號或雙引號輸出)、
想要全域性配置的話,請在Main方法體中設定:
暫時沒有找到xml方式,切記切記,全域性配置慎用!/(ㄒoㄒ)/~~
//先執行static程式碼塊,再執行該方法
//是否輸出值為null的欄位,預設為false
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask();
//數值欄位如果為null,輸出為0,而非null
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullNumberAsZero.getMask();
//List欄位如果為null,輸出為[],而非null
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullListAsEmpty.getMask();
//字元型別欄位如果為null,輸出為 "",而非null
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullStringAsEmpty.getMask()