如何配置Spring Boot以仅接收所需的JSON数据
我太懂这种痛苦了——调用API返回几百个字段的JSON,却只需要其中两三个,还要写一堆冗余的POJO代码?其实Spring Boot配合它默认的JSON处理库Jackson,就能轻松解决这个问题,下面给你几种实用的方案:
单个POJO快速解决:用注解忽略未知字段
最简单的方式就是只在你的Receive类里定义你需要的字段,然后给类加上@JsonIgnoreProperties(ignoreUnknown = true)注解。这样Jackson在反序列化的时候,会自动跳过那些你没定义的字段,不会因为存在未知属性而报错。示例代码:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; // 用Lombok可以省去写getter/setter,没有的话就自己手动编写 @JsonIgnoreProperties(ignoreUnknown = true) @Data class Receive { private String attribute4; private Integer attribute10; // 字段类型根据API返回的实际数据调整 }全局配置:一次设置,所有POJO通用
如果你不想每个类都加注解,可以在Spring Boot里做全局配置,让所有JSON反序列化操作都自动忽略未知字段。有两种实现方式:通过配置文件实现
在application.properties里添加:spring.jackson.deserialization.fail-on-unknown-properties=false或者用
application.yml的格式:spring: jackson: deserialization: fail-on-unknown-properties: false通过配置类实现
如果你需要更定制化的Jackson配置,可以写一个配置类:import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 关闭"未知属性触发报错"的特性 objectMapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return objectMapper; } }
嵌套对象的处理
如果API返回的是嵌套结构的JSON,你也只需要定义你关心的嵌套部分就行,同样给嵌套类加上@JsonIgnoreProperties(ignoreUnknown = true)注解。比如:@JsonIgnoreProperties(ignoreUnknown = true) @Data class Receive { private String attribute4; private NestedData nestedData; @JsonIgnoreProperties(ignoreUnknown = true) @Data static class NestedData { private String attribute10; // 只取嵌套对象里的这个目标字段 } }
不管你是用RestTemplate还是WebClient来调用外部API,这些配置都会生效,因为Spring Boot默认就是用Jackson来处理JSON的序列化和反序列化的。这样你就不用再写那些又长又冗余的POJO啦!
备注:内容来源于stack exchange,提问作者User69

