fastjson,物件轉json字串的過程中對value為null的值的一些處理
阿新 • • 發佈:2020-07-31
前言
fastjson是一個非常好用的java庫,用於操作物件json序列化等等。
問題
最近在寫程式碼的時候遇到問題,通過JSON.toJSONString方法將一個實體物件轉為json字串,轉出來發現原本
物件中value為null的欄位被過濾掉了。。。
實體物件
package so.sao.code;
import lombok.Data;
@Data
public class Person {
String name;
String gender;
String nickname;
String phone;
}
測試程式碼
public static void main(String[] args) { Person person = new Person(); person.setName("wyz"); String json = JSON.toJSONString(person); System.out.println(json); }
輸出結果
發現只有設定了值的欄位name才有輸出,而其餘為空的欄位則都被過濾掉了
解決
怎樣讓值為null的key不被過濾掉
- 設定SerializerFeature
設定SerializerFeature裡面有很多特性可以使用
要讓空值也能夠輸出的特性值是SerializerFeature.WriteMapNullValue
改造程式碼:
public static void main(String[] args) { Person person = new Person(); person.setName("wyz"); // String json = JSON.toJSONString(person); // System.out.println(json); // 設定SerializerFeature System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue)); }
輸出結果:
值為null屬性直接放到json字串裡面不太好看,能不能把null值轉成其他的值,比如空字串
這個時候就需要用到過濾器了,仔細看看JSON.toJSONString的其他幾個方法
toJSONString方法中可以放一個或多個過濾器,常用的過濾器有以下幾種:
要實現把null值轉為空字串的效果可以使用ValueFilter
程式碼實現:
public static void main(String[] args) { Person person = new Person(); person.setName("wyz"); // String json = JSON.toJSONString(person); // System.out.println(json); // 設定SerializerFeature // System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue)); // 設定NameFilter System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> { if(value == null){ return ""; } return value; })); }
輸出結果:
一個特殊的需求,有的值為null需要過濾,有的又不需要過濾。。。(這就是我遇到的)
使用PropertyFilter
程式碼實現:
public static void main(String[] args) {
Person person = new Person();
person.setName("wyz");
// String json = JSON.toJSONString(person);
// System.out.println(json);
// 設定SerializerFeature
// System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
// 設定NameFilter
// System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> {
// if(value == null){
// return "";
// }
//
// return value;
// }));
// 設定PropertyFilter
System.out.println(JSON.toJSONString(person, new PropertyFilter() {
@Override
public boolean apply(Object object, String name, Object value) {
return name.equals("gender") || value != null;
}
}, SerializerFeature.WriteMapNullValue));
}
輸出結果: