前言
fastjson是一个非常好用的java库,用于操作对象json序列化等等。
问题
最近在写代码的时候遇到问题,通过JSON.toJSONString方法将一个实体对象转为json字符串,转出来发现原本对象中value为null的字段被过滤掉了。
实体对象
import lombok.Data;@Datapublic class Person {String name;String gender;String nickname;String phone;}
测试代码
public static void main(String[] args) {Person person = new Person();person.setName("Fcant");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("Fcant");// String json = JSON.toJSONString(person);// System.out.println(json);// 设置SerializerFeatureSystem.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("Fcant");// String json = JSON.toJSONString(person);// System.out.println(json);// 设置SerializerFeature// System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));// 设置NameFilterSystem.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("Fcant");// 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;// }));// 设置PropertyFilterSystem.out.println(JSON.toJSONString(person, new PropertyFilter() {@Overridepublic boolean apply(Object object, String name, Object value) {return name.equals("gender") || value != null;}}, SerializerFeature.WriteMapNullValue));}
输出结果:
