Java开发中JSON库的选型比较-fastjson转换对象时属性为空null的处理为空串""的解决办法-《Java笔记》

admin 2025-10-19 03:15:10 编程 来源:ZONE.CI 全球网 0 阅读模式

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

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  3