如何通过含枚举类型的Java模型类生成包含空值的动态JSON文件
问题根因
- 实体类上标注的
@JsonInclude(JsonInclude.Include.NON_NULL)优先级高于ObjectMapper的全局序列化包含配置,你设置的全局Include.ALWAYS不生效,所有值为null的字段都会被过滤,最终只返回空对象。 - 直接实例化
DctMediaType时,type属性没有初始化,默认为null,就算允许输出null也无法得到你预期的@type默认值。
解决方案
分两种场景实现:
场景1:可修改原DctMediaType实体类
- 给
type属性添加默认初始值
// 修改type字段定义,添加默认枚举值 @JsonProperty("@type") private DctMediaType.Type type = Type.DCT_MEDIA_TYPE;
- 可选修改:将类上的
@JsonInclude(JsonInclude.Include.NON_NULL)改为@JsonInclude(JsonInclude.Include.ALWAYS),如果不想修改类注解可直接使用下方序列化代码。 - 序列化代码:
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
相关产品推荐
相关产品推荐

