Java fastjson

前言

fastjson是一个非常好用的java库,用于操作对象json序列化等等。

问题

最近在写代码的时候遇到问题,通过JSON.toJSONString方法将一个实体对象转为json字符串,转出来发现原本对象中value为null的字段被过滤掉了。
实体对象

  1. import lombok.Data;
  2. @Data
  3. public class Person {
  4. String name;
  5. String gender;
  6. String nickname;
  7. String phone;
  8. }

测试代码

  1. public static void main(String[] args) {
  2. Person person = new Person();
  3. person.setName("Fcant");
  4. String json = JSON.toJSONString(person);
  5. System.out.println(json);
  6. }

输出结果
image.png
发现只有设置了值的字段name才有输出,而其余为空的字段则都被过滤掉了

解决

怎样让值为null的key不被过滤掉

  • 设置SerializerFeature

设置SerializerFeature里面有很多特性可以使用
要让空值也能够输出的特性值是SerializerFeature.WriteMapNullValue
改造代码:

  1. public static void main(String[] args) {
  2. Person person = new Person();
  3. person.setName("Fcant");
  4. // String json = JSON.toJSONString(person);
  5. // System.out.println(json);
  6. // 设置SerializerFeature
  7. System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
  8. }

输出结果:
image.png

值为null属性直接放到json字符串里面不太好看,能不能把null值转成其他的值,比如空字符串

这个时候就需要用到过滤器了,仔细看看JSON.toJSONString的其他几个方法
toJSONString方法中可以放一个或多个过滤器,常用的过滤器有以下几种:
要实现把null值转为空字符串的效果可以使用ValueFilter
代码实现:

  1. public static void main(String[] args) {
  2. Person person = new Person();
  3. person.setName("Fcant");
  4. // String json = JSON.toJSONString(person);
  5. // System.out.println(json);
  6. // 设置SerializerFeature
  7. // System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
  8. // 设置NameFilter
  9. System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> {
  10. if(value == null){
  11. return "";
  12. }
  13. return value;
  14. }));
  15. }

输出结果:
image.png

一个特殊的需求,有的值为null需要过滤,有的又不需要过滤

使用PropertyFilter
代码实现:

  1. public static void main(String[] args) {
  2. Person person = new Person();
  3. person.setName("Fcant");
  4. // String json = JSON.toJSONString(person);
  5. // System.out.println(json);
  6. // 设置SerializerFeature
  7. // System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
  8. // 设置NameFilter
  9. // System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> {
  10. // if(value == null){
  11. // return "";
  12. // }
  13. //
  14. // return value;
  15. // }));
  16. // 设置PropertyFilter
  17. System.out.println(JSON.toJSONString(person, new PropertyFilter() {
  18. @Override
  19. public boolean apply(Object object, String name, Object value) {
  20. return name.equals("gender") || value != null;
  21. }
  22. }, SerializerFeature.WriteMapNullValue));
  23. }

输出结果:
image.png