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

Spring Boot中如何通过Jackson注解仅序列化指定字段

实现Jackson反向忽略(仅序列化指定字段)的三种方案

方案一:使用@JsonInclude+自定义PropertyFilter

这是最快捷的原生方案,不用自定义注解,直接利用Jackson的Filter机制实现:

  1. 编写自定义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());
    }
}
  1. 在DTO类上标注@JsonFilter指定过滤器名称:
@JsonFilter("includeOnlyFilter")
public class ClassToSerializeDTO {
    Object field1;
    Object field2;
    // ...
    Object field25;
}
  1. 配置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的注解解析逻辑:

  1. 定义自定义注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonIgnoreAllExcept {
    String[] value();
}
  1. 编写自定义注解解析器,将注解规则转换为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;
    }
}
  1. 配置Jackson使用自定义解析器:
@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setAnnotationIntrospector(new IgnoreAllExceptIntrospector());
        return mapper;
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:30:03