如何在Jackson反序列化JSON时忽略null值?
解决Jackson反序列化后保留null值的问题
针对你遇到的反序列化后Student对象出现null字段的情况,提供以下几种实用解决方案:
方法一:给实体类添加注解,序列化时忽略null字段
如果你的核心需求是后续将对象转成JSON时不输出null字段,直接在Student类上添加@JsonInclude注解即可:
import com.fasterxml.jackson.annotation.JsonInclude; @JsonInclude(JsonInclude.Include.NON_NULL) public class Student { private String name; private String age; // 必须添加getter/setter方法,否则Jackson无法正常序列化/反序列化 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } // 重写toString,避免打印时显示null @Override public String toString() { return "{" + name + " - " + (age != null ? age : "") + "}"; } }
配置后,当你把students序列化为JSON时,缺失age字段的Alex不会输出age项;打印对象时也不会显示null。
方法二:全局配置ObjectMapper,统一忽略null字段
如果不想给每个实体类加注解,可以全局配置ObjectMapper,让所有序列化操作都忽略null字段:
File inRulesFile = (new ClassPathResource("Student.json")).getFile(); ObjectMapper mapper = new ObjectMapper(); // 全局设置序列化时跳过null字段 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); List<Student> students = Arrays.asList(mapper.readValue(inRulesFile, Student[].class)); // 示例:序列化students,输出结果不含null字段 String jsonResult = mapper.writeValueAsString(students); // 输出内容:[{"name":"John","age":"18"},{"name":"Alex"}]
方法三:用Optional包装字段,避免直接出现null
如果希望Java对象本身就用“存在/不存在”的逻辑替代null,可以把字段类型改为Optional:
import java.util.Optional; public class Student { private String name; private Optional<String> age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Optional<String> getAge() { return age; } public void setAge(Optional<String> age) { this.age = age; } @Override public String toString() { return "{" + name + " - " + age.orElse("") + "}"; } }
此时Jackson会自动将JSON中缺失的age字段映射为Optional.empty(),后续使用时可以通过age.isPresent()判断字段是否存在,彻底避免处理null值。
方法四:重写toString方法,打印时隐藏null
如果只是打印对象时不想看到null,直接重写Student的toString方法即可:
@Override public String toString() { StringBuilder sb = new StringBuilder("{").append(name); if (age != null) { sb.append(" - ").append(age); } sb.append("}"); return sb.toString(); }
这样打印students的结果就是[{John - 18},{Alex}],不会显示null。
内容的提问来源于stack exchange,提问作者xuxu
相关产品推荐
相关产品推荐

