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功能:
- 给DTO类添加
@JsonFilter注解:
@JsonFilter("myDtoFilter") @JsonPropertyOrder({ "aaaa", "bbb", "cccc" }) public class myDto { // ... 字段定义 }
- 序列化时配置过滤器,指定只包含需要的字段:
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
相关产品推荐
相关产品推荐

