
本文详解如何配置 Jackson ObjectMapper,使其在序列化过程中保留空字符串("")而非跳过,重点解决 Include.NON_EMPTY 导致空字符串字段被省略的问题,并提供正确配置与代码示例。
本文详解如何配置 jackson objectmapper,使其在序列化过程中保留空字符串("")而非跳过,重点解决 `include.non_empty` 导致空字符串字段被省略的问题,并提供正确配置与代码示例。
在使用 Jackson 进行 JSON 序列化时,若配置了 objectMapper.setSerializationInclusion(Include.NON_EMPTY),则不仅 null 值会被忽略,空集合、空 Map、空数组以及空字符串("")也会被默认排除。这正是你遇到问题的根本原因:第二个 PhoneNumber.number 字段值为 "",因 NON_EMPTY 策略被完全省略,导致输出中缺失 "number": ""。
⚠️ 注意:DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT(如答案中所提)是反序列化(JSON → Java 对象) 的配置项,用于将空字符串解析为 null —— 它对序列化(Java 对象 → JSON)毫无影响,因此不能解决你当前的问题。
✅ 正确解法是:避免使用 Include.NON_EMPTY,改用更精确的包含策略。推荐组合使用:
-
Include.NON_NULL:排除null字段(安全且常用); - 配合
@JsonInclude(Include.NON_EMPTY)仅作用于特定字段(如需局部控制); - 或全局启用
Include.CUSTOM+ 自定义Serializers(进阶场景); -
最直接有效的方案:移除
setSerializationInclusion(Include.NON_EMPTY),仅保留Include.NON_NULL。
以下是修复后的配置示例:
private static void configureObjectMapper(ObjectMapper objectMapper) {
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.setDateFormat(new SimpleDateFormat(DATE_PATTERN));
// ✅ 仅排除 null,保留空字符串、空集合等
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// ❌ 删除这一行:objectMapper.setSerializationInclusion(Include.NON_EMPTY);
}
同时,确保你的 POJO 字段未被误加 @JsonInclude(Include.NON_EMPTY) 注解。例如:
public class PhoneNumber {
private Long id;
// ✅ 正确:不加注解,由全局配置统一控制
private String number;
// ⚠️ 错误示例(若存在)——会强制对该字段应用 NON_EMPTY
// @JsonInclude(JsonInclude.Include.NON_EMPTY)
// private String number;
// getters & setters...
}
? 补充说明:
-
Include.NON_EMPTY对String的判定逻辑是调用String.isEmpty(),因此""被视为“空”而剔除; - 若业务中必须全局排除
null和"",但又不希望影响其他空结构(如[]),应改用@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NonEmptyStringFilter.class)并自定义过滤器,而非粗粒度NON_EMPTY; - Jackson 2.14+ 版本中,
Include.NON_EMPTY行为稳定且文档明确,无需降级或切换到旧版 Codehaus Jackson(已废弃)。
总结:序列化阶段保留空字符串的关键,在于避免全局启用 Include.NON_EMPTY;优先使用 NON_NULL,按需通过字段级注解精细化控制,即可精准达成预期 JSON 输出。











