Java反射本身不直接实现JSON属性过滤,而是为Jackson、Gson等库提供获取字段/注解的能力;实际过滤由这些库结合反射,通过@JsonIgnore、@JsonInclude、自定义Serializer或ExclusionStrategy等机制动态控制字段序列化。

Java 中反射本身不直接实现 JSON 序列化时的属性过滤,它只是提供运行时读取类结构(如字段、方法、注解)的能力;真正的过滤逻辑由 JSON 库(如 Jackson、Gson)结合反射来执行。关键在于:利用反射获取字段信息 + 结合注解或自定义策略 + 在序列化过程中动态决定是否忽略某个字段。
通过 Jackson 的 @JsonIgnore 和 @JsonIgnoreProperties 实现字段级过滤
Jackson 是最常用的 JSON 库,它在序列化时会用反射扫描 Bean 的所有 getter 方法或字段,并检查是否标注了 @JsonIgnore 等注解。
- @JsonIgnore 加在字段或 getter 上,表示该字段永远不参与序列化/反序列化
-
@JsonIgnoreProperties 加在类上,可批量忽略多个字段,支持
value(白名单)和ignoreUnknown = true(忽略未知字段)
示例:
@JsonIgnoreProperties({"password", "salary"})
public class User {
private String name;
private String password;
private int salary;
@JsonIgnore
private String internalId;
// getter/setter...
}
序列化 new User() 时,password、salary、internalId 都不会出现在 JSON 中。
立即学习“Java免费学习笔记(深入)”;
用 @JsonInclude 控制空值/默认值字段的输出
这不是“过滤字段”,而是“按条件跳过值”,但常被用于精简 JSON。Jackson 通过反射获取字段值后,根据 @JsonInclude 注解判断是否写入。
-
@JsonInclude(JsonInclude.Include.NON_NULL):值为 null 时不输出 -
@JsonInclude(JsonInclude.Include.NON_EMPTY):字符串为空、集合/Map 为空时不输出 - 也可配合自定义
ValueFilter或Serializer实现更灵活逻辑
自定义 JsonSerializer + 反射实现动态字段过滤
当需要运行时决定哪些字段要序列化(比如基于用户权限、环境配置),可写一个通用的 JsonSerializer<object></object>,在其中用反射遍历字段,并根据规则跳过。
- 重写
serialize(Object value, JsonGenerator gen, SerializerProvider serializers) - 用
value.getClass().getDeclaredFields()获取所有字段 - 对每个字段设置
setAccessible(true),再用field.get(value)取值 - 结合自定义注解(如
@Sensitive)、白名单列表或回调函数判断是否跳过
注意:性能比标准方式低,适合特殊场景,不要滥用。
使用 Gson 的 ExclusionStrategy(同样依赖反射)
Gson 提供 ExclusionStrategy 接口,允许你在序列化前检查字段是否应被排除。Gson 内部通过反射获取字段类型、名称、注解等信息传给你的策略类。
- 实现
shouldSkipField(FieldAttributes f):返回 true 表示跳过该字段 - 实现
shouldSkipClass(Class> clazz):跳过整个类 - 可在
f.getAnnotation(...)中读取自定义注解,或根据f.getName()做字符串匹配
示例策略:
public class SensitiveFieldExclusion implements ExclusionStrategy {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getAnnotation(Sensitive.class) != null ||
"password".equals(f.getName()) ||
f.getDeclaredType() == InputStream.class;
}
// ...
}
注册后,Gson 会自动在反射遍历字段时调用该逻辑。


















