Spring中如何定制JSON返回:剔除冗余ID、将method下mash_temp提升至顶层
实现方案分为两种常用形式,可根据你的项目情况选择:
方案1:使用Jackson注解快速实现(无业务侵入,适配快速迭代场景)
Spring默认使用Jackson做JSON序列化,仅需给实体类加少量注解即可调整返回结构,无需修改原有业务查询逻辑:
- 在
Beer类中忽略method字段序列化,新增方法直接透出mash_temp字段:
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Collections; public class Beer { private Long id; private String name; private String description; @JsonIgnore // 序列化时直接过滤掉method字段 private Method method; // 序列化时会自动将该方法返回值映射为顶层的mash_temp字段 @JsonProperty("mash_temp") public List<MashTemp> getMashTemp() { // 空指针防护 return method != null ? method.getMashTemp() : Collections.emptyList(); } // 原有其余getter、setter保留即可 }
- 在
MashTemp类中忽略id字段的序列化:
import com.fasterxml.jackson.annotation.JsonIgnore; public class MashTemp { @JsonIgnore // 序列化时直接过滤掉id字段 private Long id; private Temp temp; // 原有其余getter、setter保留即可 }
注意:注解需导入
com.fasterxml.jackson.annotation包下的对应类,Spring Boot默认集成Jackson无需额外引入依赖。
方案2:使用DTO做结构映射(解耦分层,适配大型长期维护项目)
专门定义接口返回用的DTO类,结构完全对齐预期返回格式,业务层将数据库映射的实体类转为DTO后再返回给前端:
- 定义DTO结构:
// 啤酒接口返回对象 public class BeerDTO { private Long id; private String name; private String description; private List<MashTempDTO> mash_temp; // 补充getter、setter } // 糖化温度返回对象,不定义id字段自然不会返回 public class MashTempDTO { private Temp temp; // 补充getter、setter }
- 业务层做实体转换:可以手动写转换逻辑,也可以用MapStruct等工具自动生成转换代码,后续调整接口返回结构仅需修改DTO,不会影响底层实体类和数据库映射逻辑。
内容的提问来源于stack exchange,提问作者Filip Vidojevic
相关产品推荐
相关产品推荐

