Java Spring调用API返回JSON如何提取指定字段valor的数值?
方案1:定义POJO映射JSON结构(Spring项目推荐规范写法)
该方式契合Spring生态的最佳实践,后续接口结构调整时维护成本更低。
首先根据返回的JSON结构定义对应的映射实体类:
// 对应serie数组内的单个元素结构,若用Lombok可加@Data注解省略getter/setter public class SerieItem { private String fecha; private Double valor; // 手动补全get、set方法 public Double getValor() { return valor; } public void setValor(Double valor) { this.valor = valor; } public String getFecha() { return fecha; } public void setFecha(String fecha) { this.fecha = fecha; } }
// 对应接口返回的外层JSON结构,若用Lombok可加@Data注解省略getter/setter public class DolarApiResponse { private String version; private String autor; private String codigo; private String nombre; private String unidad_medida; private List<SerieItem> serie; // 手动补全get、set方法 public List<SerieItem> getSerie() { return serie; } public void setSerie(List<SerieItem> serie) { this.serie = serie; } // 其余字段的get、set方法可按需补充 }
修改后的Service层代码如下,直接让RestTemplate自动完成JSON到实体类的映射,提取目标值:
@Service public class DolarServiceImp implements DolarService{ @Autowired private RestTemplate restTemplate; @Override public Double getDolar() { HttpHeaders headers = new HttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); String url = "https://mindicador.cl/api/dolar/08-11-2021"; HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(map, headers); // 将响应直接映射为我们定义的DolarApiResponse实体 ResponseEntity<DolarApiResponse> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, DolarApiResponse.class); // 提取serie数组第一个元素的valor值,可根据业务需要补充空指针判断逻辑 return response.getBody().getSerie().get(0).getValor(); } }
方案2:无需定义实体类,直接用Jackson解析JSON字符串
如果不想额外创建实体类,可以直接解析返回的JSON字符串提取目标字段,Spring Boot已经内置Jackson依赖无需额外引入:
@Service public class DolarServiceImp implements DolarService{ @Autowired private RestTemplate restTemplate; // 直接注入Spring自动配置好的Jackson序列化工具 @Autowired private ObjectMapper objectMapper; @Override public Double getDolar() throws JsonProcessingException { HttpHeaders headers = new HttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); String url = "https://mindicador.cl/api/dolar/08-11-2021"; HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(map, headers); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); // 解析JSON字符串为节点树 JsonNode rootNode = objectMapper.readTree(response.getBody()); // 直接定位到serie数组第一个元素的valor字段 return rootNode.get("serie").get(0).get("valor").asDouble(); } }
注意事项
两种方案都建议补充空值校验逻辑,避免接口返回结构异常时出现空指针报错。
内容的提问来源于stack exchange,提问作者coder4life
相关产品推荐
相关产品推荐

