Java Spring Boot如何调用第三方API并解析JSON指定字段
实现方案
你当前代码直接把第三方接口返回的完整JSON字符串透传了,要单独提取经纬度字段返回,有两种常用实现方式,Spring Boot默认集成的Jackson就可以完成JSON解析,不需要额外引入依赖。
方式1:快速解析(无需额外定义类)
直接用Jackson的ObjectMapper把返回的JSON字符串解析成树模型,逐层读取目标字段即可,修改后的接口代码如下:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @RequestMapping("/api/v1/") public class ISSTrackerController { // 复用实例,不要每次请求都新建 private final ObjectMapper objectMapper = new ObjectMapper(); private final RestTemplate restTemplate = new RestTemplate(); @GetMapping("/location") public ResponseEntity<String> getISSLocation() throws Exception { String uri = "http://api.open-notify.org/iss-now.json"; String rawResult = restTemplate.getForObject(uri, String.class); // 逐层解析JSON结构 JsonNode rootNode = objectMapper.readTree(rawResult); JsonNode positionNode = rootNode.get("iss_position"); String latitude = positionNode.get("latitude").asText(); String longitude = positionNode.get("longitude").asText(); // 按需拼接展示字符串,格式可自行调整 String displayResult = String.format("国际空间站当前位置:纬度%s,经度%s", latitude, longitude); return new ResponseEntity<>(displayResult, HttpStatus.OK); } }
注意:第三方接口的经纬度字段是嵌套在
iss_position对象下的,不是JSON顶层字段,不要直接从根节点读取。
方式2:实体类映射(代码更易维护)
如果后续需要扩展接口返回的其他字段,可以先定义和JSON结构对应的实体类,让RestTemplate自动完成反序列化,不用手动解析:
- 定义经纬度实体类
public class ISSPosition { private String latitude; private String longitude; public String getLatitude() { return latitude; } public void setLatitude(String latitude) { this.latitude = latitude; } public String getLongitude() { return longitude; } public void setLongitude(String longitude) { this.longitude = longitude; } }
- 定义顶层响应实体类
import com.fasterxml.jackson.annotation.JsonProperty; public class ISSLocationResponse { private String message; private Long timestamp; // 映射JSON中下划线命名的字段 @JsonProperty("iss_position") private ISSPosition issPosition; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Long getTimestamp() { return timestamp; } public void setTimestamp(Long timestamp) { this.timestamp = timestamp; } public ISSPosition getIssPosition() { return issPosition; } public void setIssPosition(ISSPosition issPosition) { this.issPosition = issPosition; } }
- 修改接口代码直接映射实体取值
@RestController @RequestMapping("/api/v1/") public class ISSTrackerController { private final RestTemplate restTemplate = new RestTemplate(); @GetMapping("/location") public ResponseEntity<String> getISSLocation() { String uri = "http://api.open-notify.org/iss-now.json"; ISSLocationResponse response = restTemplate.getForObject(uri, ISSLocationResponse.class); String latitude = response.getIssPosition().getLatitude(); String longitude = response.getIssPosition().getLongitude(); String displayResult = String.format("纬度:%s,经度:%s", latitude, longitude); return new ResponseEntity<>(displayResult, HttpStatus.OK); } }
注意事项
- 不要在接口方法内部每次新建
RestTemplate和ObjectMapper实例,重复创建对象会浪费资源,提到类层面复用或者交给Spring容器管理即可。 - 如果只需要返回纯经纬度字符串,直接拼接
latitude + "," + longitude这类格式即可,不需要添加多余文案。 - 如果运行时出现JSON解析错误,先打印原始返回结果确认字段名是否和代码中一致,避免第三方接口字段变更导致解析失败。
内容的提问来源于stack exchange,提问作者walknthedark
相关产品推荐
相关产品推荐

