Spring Boot中如何通过Jackson注解仅序列化指定字段
实现Jackson反向忽略(仅序列化指定字段)的三种方案
方案一:使用@JsonInclude+自定义PropertyFilter
这是最快捷的原生方案,不用自定义注解,直接利用Jackson的Filter机制实现:
- 编写自定义Filter类,只保留指定字段:
public class IncludeOnlyFilter extends SimpleBeanPropertyFilter { private final Set<String> allowedFields; public IncludeOnlyFilter(Set<String> allowedFields) { this.allowedFields = allowedFields; } @Override protected boolean include(BeanPropertyWriter writer) { return allowedFields.contains(writer.getName()); } @Override protected boolean include(PropertyWriter writer) { return allowedFields.contains(writer.getName()); } }
- 在DTO类上标注
@JsonFilter指定过滤器名称:
@JsonFilter("includeOnlyFilter") public class ClassToSerializeDTO { Object field1; Object field2; // ... Object field25; }
- 配置Jackson的ObjectMapper(Spring Boot可全局配置):
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); FilterProvider filters = new SimpleFilterProvider() .addFilter("includeOnlyFilter", new IncludeOnlyFilter(Set.of("field2"))); mapper.setFilterProvider(filters); return mapper; } }
方案二:自定义@JsonIgnoreAllExcept注解
如果想要完全贴合你设想的注解形式,可以自定义注解并扩展Jackson的注解解析逻辑:
- 定义自定义注解:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface JsonIgnoreAllExcept { String[] value(); }
- 编写自定义注解解析器,将注解规则转换为Jackson的忽略逻辑:
public class IgnoreAllExceptIntrospector extends JacksonAnnotationIntrospector { @Override public Boolean hasIgnoreMarker(AnnotatedMember m) { Boolean parentResult = super.hasIgnoreMarker(m); if (parentResult != null) { return parentResult; } JsonIgnoreAllExcept annotation = m.getDeclaringClass().getAnnotation(JsonIgnoreAllExcept.class); if (annotation != null) { Set<String> allowedFields = Set.of(annotation.value()); return !allowedFields.contains(m.getName()); } return null; } }
- 配置Jackson使用自定义解析器:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setAnnotationIntrospector(new IgnoreAllExceptIntrospector()); return mapper; } }
- 在DTO上直接使用自定义注解:
@JsonIgnoreAllExcept(value = {"field2"}) public class ClassToSerializeDTO { Object field1; Object field2; // ... Object field25; }
方案三:@JsonProperty配合访问策略(小字段场景)
如果DTO字段数量不多,也可以直接通过@JsonProperty的访问权限控制实现:
public class ClassToSerializeDTO { // 仅允许反序列化,不参与序列化 @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) Object field1; // 正常参与序列化和反序列化 Object field2; // 其他字段同理设置为WRITE_ONLY @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) Object field3; // ... @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) Object field25; }
内容的提问来源于stack exchange,提问作者smeds
相关产品推荐
相关产品推荐

