如何在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
相关产品推荐
相关产品推荐

