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

如何在JSON输出中隐藏Java字段?@JsonIgnore失效解决方法

@JsonIgnore 不生效的常见原因

针对你贴的getter方法场景,注解失效基本逃不开这几个问题:

  • 注解位置错误:Jackson默认会扫描所有public getter方法作为序列化属性,如果你只把@JsonIgnore加在类内部的私有字段上、没加在这个public的getPrice()方法上,注解不会生效
  • 导包错误:如果项目里同时存在多个JSON序列化框架的依赖,很容易导错注解包,比如导了旧版本codehaus包的注解、或者Fastjson/Gson的同名注解,和你实际用的序列化框架不匹配
  • 全局配置覆盖:如果项目里自定义了Jackson的ObjectMapper配置,比如修改了字段检测规则、加了全局属性包含策略,可能会导致方法上的注解被覆盖
正确实现方式

根据你项目用的序列化框架选对应方案即可:

1. Jackson(SpringBoot默认序列化框架)

首先确认注解导入的是com.fasterxml.jackson.annotation.JsonIgnore包,直接把注解加在getPrice方法上:

import com.fasterxml.jackson.annotation.JsonIgnore;

@Override
@JsonIgnore
public final BigDecimal getPrice() {
    if (best != null) {
        return packet.Price();
    }
    return null;
}

如果加完还是不生效,在当前类上补充@JsonIgnoreProperties注解做兜底,直接指定要忽略的属性名:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(value = {"price"})
public class YourBusinessClass {
    // 类内部其他逻辑
}

2. Fastjson

如果项目序列化用的是Fastjson,换用Fastjson自带的注解配置即可:

import com.alibaba.fastjson.annotation.JSONField;

@Override
@JSONField(serialize = false)
public final BigDecimal getPrice() {
    if (best != null) {
        return packet.Price();
    }
    return null;
}

3. Gson

如果用Gson做序列化,对于这种没有对应实体字段、通过getter计算返回值的属性,配置自定义排除策略即可:

Gson customGson = new GsonBuilder()
    .addSerializationExclusionStrategy(new ExclusionStrategy() {
        @Override
        public boolean shouldSkipField(FieldAttributes fieldAttr) {
            return "price".equals(fieldAttr.getName());
        }

        @Override
        public boolean shouldSkipClass(Class<?> clazz) {
            return false;
        }
    })
    .create();
// 序列化的时候用这个自定义的customGson实例即可
验证方法

改完后直接写单元测试,实例化当前类后调用序列化方法打印结果,确认price字段未出现在JSON输出中即可,不要直接靠接口联调排查,避免被全局拦截器、自定义序列化过滤器之类的逻辑干扰判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:51:28