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

Spring Boot DTO转JSON仅保留指定JsonProperty字段问题求助

问题描述

我有如下Java DTO类:

@JsonPropertyOrder({ "aaaa", "bbb", "cccc" })
public class myDto {
    @Id
    private String id;
    @Valid
    @NotNull
    @JsonProperty("aaaa")
    private String aaaa;
    @Valid
    @NotNull
    @JsonProperty("bbbb")
    private List<String> bbbb;
    @Valid
    @NotNull
    @JsonProperty("cccc")
    private List<String> cccc;
    // 上述4个字段的getter和setter
}

我希望将这个DTO转换为仅包含aaaa、bbbb、cccc三个字段的JSON,预期输出如下:

{"aaaa":"1","bbbb":["1"],"cccc":["1"]}

但我用以下代码生成JSON时,结果里包含了id、meta、links字段(值为null):

String test = objectMapper.writeValueAsString(myDto);
configuration = new JSONObject(test);

实际输出:

{"aaaa":"1","bbbb":["1"],"cccc":["1"],"meta":null,"links":null,"id":null}

需要解决这个问题,确保转换后的JSON只保留指定的三个字段。

解决方案

方法1:通过注解指定忽略字段

直接在不需要序列化的字段上添加@JsonIgnore注解,让Jackson跳过该字段的序列化:

@Id
@JsonIgnore
private String id;

如果meta和links是来自父类的字段,可以在当前DTO类上添加@JsonIgnoreProperties注解来忽略父类中的指定字段:

@JsonPropertyOrder({ "aaaa", "bbb", "cccc" })
@JsonIgnoreProperties({"meta", "links"})
public class myDto {
    // ... 字段定义
}

方法2:配置Jackson忽略所有Null值字段

如果业务允许,可以让ObjectMapper只序列化非Null的字段,这样所有值为Null的字段会自动被排除:

ObjectMapper objectMapper = new ObjectMapper();
// 只包含非Null的字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String test = objectMapper.writeValueAsString(myDto);

注意:如果目标字段(aaaa/bbbb/cccc)可能出现Null值,这种方法会把它们也排除,需要根据实际场景判断是否适用。

方法3:使用JsonFilter动态指定序列化字段

如果需要更灵活的字段控制(比如动态决定哪些字段序列化),可以使用Jackson的JsonFilter功能:

  1. 给DTO类添加@JsonFilter注解:
@JsonFilter("myDtoFilter")
@JsonPropertyOrder({ "aaaa", "bbb", "cccc" })
public class myDto {
    // ... 字段定义
}
  1. 序列化时配置过滤器,指定只包含需要的字段:
ObjectMapper objectMapper = new ObjectMapper();
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
// 只保留指定的三个字段
filterProvider.addFilter("myDtoFilter", SimpleBeanPropertyFilter.filterOutAllExcept("aaaa", "bbbb", "cccc"));
objectMapper.setFilterProvider(filterProvider);
String test = objectMapper.writeValueAsString(myDto);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:22:48