## 問題描述:
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工具,使用同一套解析器比較穩定。
