程序员的资源宝库

网站首页 > gitee 正文

关于SpringBoot项目使用Hutool工具进行json序列化时出现Null值过滤或者丢失的问题

sanyeah 2024-04-12 17:41:28 gitee 3 ℃ 0 评论

## 问题描述:

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表