fastjson是一个非常好用的java库,用于操作对象json序列化等等。
问题
最近在写代码的时候遇到问题,通过JSON.toJSONString方法将一个实体对象转为json字符串,转出来发现原本
对象中value为null的字段被过滤掉了。
实体对象
importlombok.Data;
@DatapublicclassPerson {
Stringname;
Stringgender;
Stringnickname;
Stringphone;
}
测试代码
输出结果
发现只有设置了值的字段name才有输出,而其余为空的字段则都被过滤掉了
解决
怎样让值为null的key不被过滤掉
- 设置SerializerFeature
设置SerializerFeature里面有很多特性可以使用
要让空值也能够输出的特性值是SerializerFeature.WriteMapNullValue
改造代码:
// 设置SerializerFeatureSystem. out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue)); }
输出结果:
值为null属性直接放到json字符串里面不太好看,能不能把null值转成其他的值,比如空字符串
这个时候就需要用到过滤器了,仔细看看JSON.toJSONString的其他几个方法
toJSONString方法中可以放一个或多个过滤器,常用的过滤器有以下几种:
要实现把null值转为空字符串的效果可以使用ValueFilter
代码实现:
// 设置SerializerFeature// System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
// 设置NameFilterSystem. out.println(JSON.toJSONString(person, (ValueFilter) ( object, name, value) -> { if( value== null){ return""; }
returnvalue; }));}
输出结果:
一个特殊的需求,有的值为null需要过滤,有的又不需要过滤。。。(这就是我遇到的)
使用PropertyFilter
代码实现:
// 设置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, newPropertyFilter { @ Overridepublicboolean apply( Object object, String name, Object value) { returnname. equals( "gender") || value!= null; }}, SerializerFeature.WriteMapNullValue));}返回搜狐,查看更多
责任编辑: