如何让Jackson序列化时将NULL日期字段输出为空字符串而非忽略
解决方案:Jackson序列化时保留null的Date字段并转为空字符串
针对userIndDate(java.util.Date类型)为null时不显示在响应中的问题,提供以下几种可行方案:
方案1:字段级注解+自定义序列化器
在SearchResponse实体类的userIndDate字段上添加注解,强制序列化null字段并自定义空值输出:
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Date; public class SearchResponse { // 其他字段... @JsonInclude(JsonInclude.Include.ALWAYS) // 强制序列化null值字段 @JsonSerialize(using = NullDateToStringSerializer.class) // 自定义序列化逻辑 private Date userIndDate; // getter、setter、builder代码... }
实现自定义序列化器,处理null值为空字符串,非null值按指定格式序列化:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class NullDateToStringSerializer extends JsonSerializer<Date> { // 可根据需求调整日期格式 private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { if (date == null) { jsonGenerator.writeString(""); } else { jsonGenerator.writeString(DATE_FORMAT.format(date)); } } }
方案2:全局Jackson配置(批量处理所有Date字段)
如果多个Date类型字段都需要相同的null值处理逻辑,可以在Spring Boot配置类中全局配置ObjectMapper:
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Date; @Configuration public class JacksonGlobalConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 全局设置:序列化时包含所有null值字段 objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); // 注册自定义序列化器,处理所有Date类型字段 SimpleModule dateModule = new SimpleModule(); dateModule.addSerializer(Date.class, new NullDateToStringSerializer()); objectMapper.registerModule(dateModule); return objectMapper; } }
注意:全局配置会影响所有Date类型字段,若仅需处理特定字段,优先选择方案1。
验证效果
修改后,当userIndDate为null时,响应结果会包含该字段并输出空字符串:
{ "searchResponse": [ { "loc": "1", "item": 2, "itemDesc": "someItemDesc", "locDesc": "someLocDesc", "ase": 1.00000000000000000, "aseStartDate": "2023-07-01", "indDate": "2023-12-30", "userIndDate": "" } ], "message": "", "warning": "", "responseCode": "0" }
内容的提问来源于stack exchange,提问作者wheelerlc64
相关产品推荐
相关产品推荐

