關於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工具,使用同一套解析器比較穩定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM