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

@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已停止维护)

  1. 移除所有org.codehaus.jackson相关依赖(此处为jackson-xc)
  2. 添加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>
  1. 修改FormatAlerts类中ObjectMapper的导入路径为Jackson 2.x的包:
import com.fasterxml.jackson.databind.ObjectMapper;

方案二:统一使用Jackson 1.x版本(仅兼容旧系统时使用)

  1. 移除所有com.fasterxml.jackson相关依赖
  2. 修改@JsonIgnore的导入路径为1.x版本的包:
import org.codehaus.jackson.annotate.JsonIgnore;
  1. 保留org.codehaus.jackson.map.ObjectMapper的导入及jackson-xc依赖(若需要其功能)

额外注意

Jackson默认优先通过getter方法序列化字段,若仅在字段上添加@JsonIgnore无效,可尝试将注解添加到getSocialSecurityNumber()方法上,或配置ObjectMapper的序列化策略为仅序列化字段,但版本统一是解决问题的核心前提。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:24:53