关于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工具,使用同一套解析器比较稳定。

posted @ 2024-05-17 09:51  全琪俊  阅读(845)  评论(0编辑  收藏  举报