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

如何通过含枚举类型的Java模型类生成包含空值的动态JSON文件

问题根因
  • 实体类上标注的@JsonInclude(JsonInclude.Include.NON_NULL)优先级高于ObjectMapper的全局序列化包含配置,你设置的全局Include.ALWAYS不生效,所有值为null的字段都会被过滤,最终只返回空对象。
  • 直接实例化DctMediaType时,type属性没有初始化,默认为null,就算允许输出null也无法得到你预期的@type默认值。
解决方案

分两种场景实现:

场景1:可修改原DctMediaType实体类

  1. 给type属性添加默认初始值
// 修改type字段定义,添加默认枚举值
@JsonProperty("@type")
private DctMediaType.Type type = Type.DCT_MEDIA_TYPE;
  1. 可选修改:将类上的@JsonInclude(JsonInclude.Include.NON_NULL)改为@JsonInclude(JsonInclude.Include.ALWAYS),如果不想修改类注解可直接使用下方序列化代码。
  2. 序列化代码:
ObjectMapper dynamicMapper = new ObjectMapper();
dynamicMapper.enable(SerializationFeature.INDENT_OUTPUT);
// 强制覆盖类上的JsonInclude规则,输出所有字段包括null
dynamicMapper.configOverride(DctMediaType.class)
        .setInclude(JsonInclude.Value.construct(JsonInclude.Include.ALWAYS, JsonInclude.Include.ALWAYS));
String jsonValue = dynamicMapper.writeValueAsString(new DctMediaType());

场景2:不可修改原DctMediaType实体类

直接在实例化后手动设置type属性,同时配置ObjectMapper覆盖类注解规则即可:

// 实例化后手动设置默认type值
DctMediaType mediaType = new DctMediaType();
mediaType.setType(DctMediaType.Type.DCT_MEDIA_TYPE);

ObjectMapper dynamicMapper = new ObjectMapper();
dynamicMapper.enable(SerializationFeature.INDENT_OUTPUT);
// 覆盖类上的序列化规则,输出null字段
dynamicMapper.configOverride(DctMediaType.class)
        .setInclude(JsonInclude.Value.construct(JsonInclude.Include.ALWAYS, JsonInclude.Include.ALWAYS));
String jsonValue = dynamicMapper.writeValueAsString(mediaType);

以上两种方案都可以得到你预期的JSON输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 22:15:00