关于SpringBoot项目使用Hutool工具进行json序列化时出现Null值过滤或者丢失的问题(转载)
## 问题描述:
SpringBoot项目中,一直使用的时Hutool的json转换工具,被强制要求不能使用fastJson工具;之前都没什么问题,突然有一次使用parseObj()进行json字符串转换json对象时,突然报错:No serializer found for class cn.hutool.json.JSONNull and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ;大致意思就是:被转换的对象中存在有属性值为空的存在,导致序列化异常
## 初步解决方式
查阅Hutool的官方文档:说是json序列化时会默认忽略空值转换,如果想要保留空值和对应的key,则在方法中添加一个参数:即
``` java
JSONUtil.parseObj(data, false);//第二个参数是忽略空值,此处设置为否
```
然而这样并不能保证顺利解决,依旧出现序列化异常
## 错误原因分析
Jsckson是SpringBoot内置的一个json和xml的框架,如果在springboot项目中rest接口返回的结果是自定义对象,则默认会使用Jackson的序列化工具将对象序列化为Json再返回。
Hutool的Json里用JSONNull对象代替了null,而且JSONNull类没有适用于Jackson序列化的序列化器,此时如果接口返回值对象里使用了Hutool的Json,又凑巧存在被JSONNull对象代替了的null值,则返回序列化值时会出现以上的异常
## 解决方式一:自定义序列化器
~~~
import cn.hutool.json.JSONNull;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.jackson.JsonComponent;
import java.io.IOException;
/**
* @Author: G_ONE
* @Date: 2022/4/12 10:00
* @Version: 1.0
**/
@JsonComponent
public class JsonNullSerizlizer extends JsonSerializer<JSONNull> {
@Override
public void serialize(JSONNull jsonNull, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
jsonGenerator.writeNull();
}
}
~~~
## 解决方式二
直接更换json工具,使用同一套解析器比较稳定。