Spring Boot接口如何将嵌套请求体结构扁平化接收为一级属性?
解决方案
下面是两种常用的可直接落地的实现方式:
方式一:使用Jackson自带的@JsonUnwrapped注解(推荐,无需改动原有嵌套结构)
该注解可以在反序列化时自动把扁平化的字段映射到下层嵌套对象中,仅需修改Request类即可:
@Getter @Setter @NoArgsConstructor @AllArgsConstructor public class Request { // 把Address类的所有字段展开到Request层级做映射 @JsonUnwrapped private Address address; // 把Name类的所有字段展开到Request层级做映射 @JsonUnwrapped private Name name; }
注意事项
- 如果Address和Name类存在同名字段,可以指定前缀避免冲突,示例:
// 展开后Address的字段需要匹配带addr_前缀的JSON字段,对应addr_city、addr_postalCode @JsonUnwrapped(prefix = "addr_") private Address address; // 展开后Name的字段需要匹配带name_前缀的JSON字段,对应name_firstName、name_lastName @JsonUnwrapped(prefix = "name_") private Name name;
- 如果不希望该注解影响接口返回的序列化结构,可以单独关闭序列化生效:
@JsonUnwrapped(deserialization = true, serialization = false)
方式二:直接扁平化Request类定义
如果没有复用Address、Name嵌套结构的需求,可以直接把所有字段定义在Request类中:
@Getter @Setter @NoArgsConstructor @AllArgsConstructor public class Request { private String postalCode; private String city; private String firstName; private String lastName; }
以上两种方式修改完成后,都可以直接接收你给出的扁平化一级JSON结构请求体。
内容的提问来源于stack exchange,提问作者Tomy
相关产品推荐
相关产品推荐

