You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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自动完成反序列化,不用手动解析:

  1. 定义经纬度实体类
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; }
}
  1. 定义顶层响应实体类
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; }
}
  1. 修改接口代码直接映射实体取值
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:18:39