Java解析新加坡taxi-availability API嵌套JSON获取coordinates数组
解决嵌套JSON中获取coordinates数组的问题
问题原因
你遇到的错误是因为obj.getJSONArray("features").get(0)返回的是Object类型,该类型没有getJSONObject方法,必须先强制转换为JSONObject才能继续调用后续方法。
方案1:修复现有org.json代码
如果继续使用你当前的JSONObject库(大概率是org.json),修改代码如下:
JSONArray features = obj.getJSONArray("features"); // 先把get(0)的结果强转为JSONObject JSONObject firstFeature = (JSONObject) features.get(0); JSONObject geometry = firstFeature.getJSONObject("geometry"); JSONArray coordinates = geometry.getJSONArray("coordinates"); // 现在coordinates就是你要的数组,可以遍历处理 for (int i = 0; i < coordinates.length(); i++) { JSONObject coord = coordinates.getJSONObject(i); // 处理单个坐标对象 }
方案2:使用更灵活的JSON库(推荐)
如果不想频繁强转,推荐使用Jackson或Gson,它们的API更友好,处理嵌套JSON更方便:
用Jackson的示例
- 先添加Jackson依赖(Maven):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
- 解析代码:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; String uri = "https://api.data.gov.sg/v1/transport/taxi-availability"; RestTemplate restTemplate = new RestTemplate(); String result = restTemplate.getForObject(uri, String.class); ObjectMapper mapper = new ObjectMapper(); JsonNode root = mapper.readTree(result); // 直接链式导航,无需手动强转 JsonNode coordinates = root.path("features").get(0).path("geometry").path("coordinates"); // 遍历数组 for (JsonNode coord : coordinates) { // 处理每个坐标节点,比如获取经度纬度: double lon = coord.get(0).asDouble(); double lat = coord.get(1).asDouble(); }
用Gson的示例
- 添加Gson依赖(Maven):
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
- 解析代码:
import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; String uri = "https://api.data.gov.sg/v1/transport/taxi-availability"; RestTemplate restTemplate = new RestTemplate(); String result = restTemplate.getForObject(uri, String.class); JsonObject root = JsonParser.parseString(result).getAsJsonObject(); JsonArray features = root.getAsJsonArray("features"); JsonObject firstFeature = features.get(0).getAsJsonObject(); JsonObject geometry = firstFeature.getAsJsonObject("geometry"); JsonArray coordinates = geometry.getAsJsonArray("coordinates"); // 遍历处理 for (int i = 0; i < coordinates.size(); i++) { JsonObject coord = coordinates.get(i).getAsJsonObject(); // 处理逻辑 }
这两种库都不需要定义实体类,就能轻松处理嵌套JSON结构,比原始的org.json更省心。
内容的提问来源于stack exchange,提问作者jingwen
相关产品推荐
相关产品推荐

