之前项目中,大部分代码都是使用的fastjson,由于上级领导说fastjson包不再更新维护,决定换成hutool json。其中遇到了hutool json JsonNull相关问题,故做此记录。
问题一:hutool json中null值存储是使用的JSONNull
所以在做对象转换时,如有字段为null则会报错
JSONObject json= (JSONObject) record;
Map<String, Object> dataItem = json.toBean(Map.class);
String signTime = (String) dataItem.get("signTime");
上面代码,当字段signTime字段为null时,第三段代码则会报类型转换错误 (JSONNull转String)
解决办法:
1.不进行强制类型转换
2.用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)
JSONNull序列化问题
这是由于:
Jsckson是SpringBoot内置的一个json和xml的框架,如果在springboot项目中rest接口返回的结果是自定义对象,则默认会使用Jackson的序列化工具将对象序列化为Json再返回。
Hutool的Json里用JSONNull对象代替了null,而且JSONNull类没有适用于Jackson序列化的序列化器,此时如果接口返回值对象里使用了Hutool的Json,又凑巧存在被JSONNull对象代替了的null值,则返回序列化值时会出现以上的异常
解决办法:
1.自定义序列化器
package com.hm.base.openapi.common.config;
import cn.hutool.json.JSONNull;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
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;
import java.util.Map;
/**
* @author: kary.zhang
* @create: 2024-02-02 11:41
* @Description:
*/
@JsonComponent
public class JsonNullSerializer extends JsonSerializer<JSONNull> {
@Override
public void serialize(JSONNull jsonNull, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeNull();
}
2.更换json工具