前言

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));
}

输出结果:

fastjson,对象转json字符串的过程中对value为null的值的一些处理的更多相关文章

  1. fastjson对象转为json字符串日期格式变为时间戳问题

    今天尝试将map集合转为json对象时遇到一个问题.map中的value为日期格式如"2019-03-01",在使用JSONObject.toJSON(map).toString( ...

  2. fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化

    fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化 在开发过程中,经常需要和前端交互数据,数据交互的格式都是JSON,在此过程中免不了json字符串 ...

  3. js 中 json对象 与 json字符串 间相互转换

    在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键 JSON字符串:  var str1 = '{ " ...

  4. Springboot 通过FastJson实现bean对象和Json字符串互转

    Json格式在后台服务中的重要性就不多说了,直入正题.首先引入pom文件,这里使用的是1.2.83版本 1 <dependency> 2 <groupId>com.alibab ...

  5. jQuery中json对象与json字符串互换

    json字符串转json对象:jQuery.parseJSON(jsonStr); json对象转json字符串:JSON.stringify(jsonObj); 根据“|”把字符串变成数组.spli ...

  6. java对象与Json字符串之间的转化(fastjson)

    1. 首先引入jar包 在pom.xml文件里加入下面依赖: <dependency> <groupId>com.alibaba</groupId> <art ...

  7. struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)

    JSON主要创建如下两种数据对象: 由JSON格式字符串创建,转换成JavaScript的Object对象: 由JSON格式字符串创建,转换成JavaScript的List或数组链表对象. 更多关于J ...

  8. JS中实现JSON对象和JSON字符串之间的相互转换

    对于主流的浏览器(比如:firefox,chrome,opera,safari,ie8+),浏览器自己提供了JSON对象,其中的parse和stringify方法实现了JSON对象和JSON字符串之间 ...

  9. js中 json对象与json字符串相互转换的几种方式

    以下总结js中 json对象与json字符串相互转换的几种方式: 一.JSON对象转化为JSON字符串 1.使用JSON.stringify()方法进行转换 该方法不支持较老版本的IE浏览器,比如:i ...

随机推荐

  1. mysql必知必会——GROUP BY和HAVING

    mysql必知必会——GROUP BY和HAVING 创建表结构 create table `employ_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...

  2. 深入了解Netty【六】Netty工作原理

    引言 前面学习了NIO与零拷贝.IO多路复用模型.Reactor主从模型. 服务器基于IO模型管理连接,获取输入数据,又基于线程模型,处理请求. 下面来学习Netty的具体应用. 1.Netty线程模 ...

  3. JavaScript(es6)数组常用的方法

    常用方法 1.forEach() var data = [1,2,3,4,5]; var sum = 0;//求和 data.forEach((item)=>{sum+=item}) //给原数 ...

  4. Activiti7 网关(包含网关)

    什么是包含网关? 包含网关可以看做是排他网关和并行网关的结合体,和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析他们,但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关是一样的 ...

  5. TonWeb6.1Linux安装文档

    东方通部署文档   东方通安装部署文档 准备文件:开始安装:警告:在安装之前先安装JDK,JDK要求JDK5以上Linux安装:运行安装包sh Install_TW6.1.5.15_Standard_ ...

  6. 20190923-08Linux压缩和解压类 000 016

    gzip/gunzip 压缩 1.基本语法 gzip 文件 (功能描述:压缩文件,只能将文件压缩为*.gz文件) gunzip 文件.gz (功能描述:解压缩文件命令) 2.经验技巧 (1)只能压缩文 ...

  7. jmeter服务器监控磁盘IO、网络-PerfMon Metrics Collector

    1.jmeetr客户端安装jp@gc - PerfMon Metrics Collector 先安装jmeter-plugins 启动jmeter ——> 客户端选项 ——> jmeter ...

  8. elasticsearch跨集群数据迁移

    写这篇文章,主要是目前公司要把ES从2.4.1升级到最新版本7.8,不过现在是7.9了,官方的文档:https://www.elastic.co/guide/en/elasticsearch/refe ...

  9. oracle之三手工备份与恢复

    手工备份与恢复 2.1 手工备份和恢复的命令 1)备份和还原都使用OS命令,如linux中的cp 2)恢复用sqlplus命令:recover 2.2 备份前要对数据库进行检查: 1) 检查需要备份的 ...

  10. 学习 | less入门

    最近在写css的时候,发现自己写的css特别长,觉得自己写的特别low,所以为了加快自己的开发效率,又重新温习了less,下面就是我学习less的过程. less是不能被浏览器识别的,要转换成css, ...