微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐