You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为特定POJO覆盖Jackson ObjectMapper序列化配置保留null字段

问题根因

你遇到的问题是三个错误叠加导致的:

  • 自定义序列化器泛型声明错误:你的序列化器定义为extends JsonSerializer<MyCustomSerializer>,泛型参数应该是要序列化的目标类型MyObject,而非序列化器自身。类型不匹配导致Jackson根本没有调用你写的序列化逻辑,直接走了默认的POJO序列化流程。
  • 注解拼写错误:你添加的@JsonInclude(JsonInclude.Include.AWLAYS)存在拼写错误,正确枚举值为ALWAYS,拼写错误导致注解无法生效。
  • 序列化逻辑分支缺失:就算修正泛型让自定义序列化器生效,你当前的serialize方法仅处理了value == null的分支,当传入的MyObject实例非null时,方法内没有任何输出逻辑,依然无法得到预期结果。

额外说明:如果你使用全自定义的JsonSerializer接管类的序列化流程,类和字段上的@JsonInclude规则默认不会自动生效——所有字段的输出逻辑、null值处理都需要你在序列化方法中手动编码实现,全局的NON_EMPTY规则不会拦截你直接通过JsonGenerator写入的内容。

解决方案

根据你是否需要保留自定义序列化逻辑,二选一即可:

方案1:保留自定义序列化器(适合需要定制序列化逻辑的场景)

修正序列化器代码,补全全部分支逻辑:

// 修正泛型声明为目标序列化类型MyObject
public class MyCustomSerializer extends JsonSerializer<MyObject> {

    @Override
    public void serialize(MyObject value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        if (value == null) {
            gen.writeNullField("AString");
            gen.writeNullField("BString");
        } else {
            // 非null场景逐字段写入,值为null时直接写null字段即可,不会被全局NON_EMPTY规则过滤
            gen.writeObjectField("AString", value.getAString());
            gen.writeObjectField("BString", value.getBString());
        }
        gen.writeEndObject();
    }
}

修正后不需要额外加@JsonInclude注解,自定义逻辑会直接输出null字段,符合你的预期。

方案2:移除自定义序列化器(仅需输出null字段时推荐,代码更简洁)

如果你写自定义序列化器只是为了实现null字段输出,完全不需要额外编写序列化类,做两处修改即可:

  1. 删除MyObject类上的@JsonSerialize(using = MyCustomSerializer.class)注解
  2. 在MyObject类上添加正确拼写的类级别@JsonInclude注解,覆盖全局序列化规则:
@JsonIgnoreProperties(ignoreUnknown = true)
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
// 类级别配置优先级高于全局NON_EMPTY规则,强制序列化所有字段包括null值
@JsonInclude(JsonInclude.Include.ALWAYS)
public class MyObject {

    @JsonProperty("AString")
    private String aString;

    @JsonProperty("BString")
    private String bString;
}

可选:针对特定类型单独配置规则(无需加注解)

如果你不想在POJO上加注解,也可以直接在ObjectMapper层面为MyObject单独配置序列化规则,优先级高于全局配置,不会影响其他类型的NON_EMPTY逻辑:

objectMapper.configOverride(MyObject.class)
        .setInclude(JsonInclude.Value.construct(JsonInclude.Include.ALWAYS, JsonInclude.Include.ALWAYS));

内容的提问来源于stack exchange,提问作者peachish11235

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:48:34