如何在Jackson序列化时忽略空Optional字段
解决Jackson序列化忽略值为null的Optional字段问题
问题原因
你当前配置的JsonInclude.Include.NON_NULL仅会忽略字段本身为null的情况,但secondName对应的Optional对象本身并非null,只是它包裹的值为null,因此Jackson会把这个空Optional序列化成null,无法达到你想要的忽略效果。
解决方案
方案一:改用JsonInclude.Include.NON_ABSENT
将序列化包含规则替换为NON_ABSENT,它会同时忽略空Optional对象和null值:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new Jdk8Module()); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT); System.out.println(objectMapper.writeValueAsString(employee));
方案二:配置Jdk8Module忽略空Optional
注册Jdk8Module时,关闭configureAbsentsAsNulls配置,让空Optional直接被忽略而非序列化成null:
ObjectMapper objectMapper = new ObjectMapper(); Jdk8Module jdk8Module = new Jdk8Module(); jdk8Module.configureAbsentsAsNulls(false); objectMapper.registerModule(jdk8Module); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); System.out.println(objectMapper.writeValueAsString(employee));
方案三:针对特定字段添加注解
如果只需对部分Optional字段生效,可以在对应的get方法上添加@JsonInclude(JsonInclude.Include.NON_ABSENT)注解:
class Employee { private String firstName; private String secondName; @JsonInclude(JsonInclude.Include.NON_ABSENT) public Optional<String> getFirstName() { return Optional.ofNullable(firstName); } public void setFirstName(String firstName) { this.firstName = firstName; } @JsonInclude(JsonInclude.Include.NON_ABSENT) public Optional<String> getSecondName() { return Optional.ofNullable(secondName); } public void setSecondName(String secondName) { this.secondName = secondName; } }
应用上述任意方案后,都会得到你期望的序列化结果:
{"firstName":"foo"}
内容的提问来源于stack exchange,提问作者Zeeshan
相关产品推荐
相关产品推荐

