1. 程式人生 > 其它 >FastJson 設定預設引數

FastJson 設定預設引數

技術標籤:JAVA相關java

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全域性配置說明

  1. SerializerFeature.PrettyFormat:格式化輸出
  2. SerializerFeature.WriteMapNullValue:是否輸出值為null的欄位,預設為false
  3. SerializerFeature.DisableCircularReferenceDetect:消除迴圈引用
  4. SerializerFeature.WriteNullStringAsEmpty:將為null的欄位值顯示為""
  5. WriteNullListAsEmpty:List欄位如果為null,輸出為[],而非null
  6. WriteNullNumberAsZero:數值欄位如果為null,輸出為0,而非null
  7. WriteNullBooleanAsFalse:Boolean欄位如果為null,輸出為false,而非null
  8. SkipTransientField:如果是true,類中的Get方法對應的Field是transient,序列化時將會被忽略。預設為true
  9. SortField:按欄位名稱排序後輸出。預設為false
  10. WriteDateUseDateFormat:全域性修改日期格式,預設為false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
  11. BeanToArray:將物件轉為array輸出
  12. QuoteFieldNames:輸出key時是否使用雙引號,預設為true
  13. 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()