@JsonIgnore注解未生效,Jackson序列化未忽略指定字段
问题:Jackson的@JsonIgnore注解未生效,字段未被忽略
我尝试用Jackson将POJO转换为JSON时忽略指定字段,代码实现如下,但添加@JsonIgnore注解的字段依然出现在JSON输出中。
相关代码
POJO类代码
import com.fasterxml.jackson.annotation.JsonIgnore; public class MyPOJO { @JsonIgnore private String socialSecurityNumber = "111-11-1111"; // ... public String getSocialSecurityNumber() { return socialSecurityNumber; } // ... }
JSON序列化工具类代码
import java.util.ArrayList; import java.util.List; import java.io.IOException; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; public class FormatAlerts { List<Message> alerts = new ArrayList<>(); public FormatAlerts(List<Message> alerts) { this.alerts = alerts; } public List<String> formatAlerts() { List<String> formattedAlerts = new ArrayList<>(); ObjectMapper om = new ObjectMapper(); try { for(Message m : alerts) { String alert = om.defaultPrettyPrintingWriter() .writeValueAsString(m); formattedAlerts.add(alert); } } catch(Exception e) { e.printStackTrace(); } return formattedAlerts; } }
Maven依赖配置
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-xc</artifactId> <version>1.9.12</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.14.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.14.2</version> </dependency> </dependencies>
问题原因
核心问题是Jackson版本混用:
- 序列化使用的
ObjectMapper来自org.codehaus.jackson(Jackson 1.x版本的包) - 但注解
@JsonIgnore导入的是com.fasterxml.jackson.annotation(Jackson 2.x版本的注解)
Jackson 1.x和2.x属于完全独立的包体系,两者API不兼容,跨版本使用注解和核心库会导致注解无法被识别,因此字段不会被忽略。
解决方案
方案一:统一使用Jackson 2.x版本(推荐,1.x已停止维护)
- 移除所有
org.codehaus.jackson相关依赖(此处为jackson-xc) - 添加Jackson 2.x的完整核心依赖,确保版本一致:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- Jackson 2.x 核心依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.14.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.14.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.14.2</version> </dependency> </dependencies>
- 修改
FormatAlerts类中ObjectMapper的导入路径为Jackson 2.x的包:
import com.fasterxml.jackson.databind.ObjectMapper;
方案二:统一使用Jackson 1.x版本(仅兼容旧系统时使用)
- 移除所有
com.fasterxml.jackson相关依赖 - 修改
@JsonIgnore的导入路径为1.x版本的包:
import org.codehaus.jackson.annotate.JsonIgnore;
- 保留
org.codehaus.jackson.map.ObjectMapper的导入及jackson-xc依赖(若需要其功能)
额外注意
Jackson默认优先通过getter方法序列化字段,若仅在字段上添加@JsonIgnore无效,可尝试将注解添加到getSocialSecurityNumber()方法上,或配置ObjectMapper的序列化策略为仅序列化字段,但版本统一是解决问题的核心前提。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

