Java如何访问JSON对象中重复的lat、lon及name字段值
问题解答
错误原因
你原有代码无法生效的核心原因是没有匹配JSON的层级结构:
你手里的JSON层级为:根对象 → elements数组 → 单个node对象 → lat/lon字段 + tags子对象 → name字段lat 不是根对象的直接字段,同时lat是数值类型,你调用getString也会触发类型不匹配错误,name则更深一层,存放在每个node对象的tags子对象中。
正确实现(基于org.json库,即你当前使用的JSONObject所属依赖)
import org.json.JSONArray; import org.json.JSONObject; public class OverpassDataParser { public static void main(String[] args) { // 替换为你的实际JSON字符串 String rawJson = "你获取到的完整JSON字符串"; JSONObject root = new JSONObject(rawJson); // 读取根节点下的elements数组 JSONArray elements = root.getJSONArray("elements"); int elementCount = elements.length(); for (int i = 0; i < elementCount; i++) { JSONObject currentElement = elements.getJSONObject(i); // 跳过非node类型的元素 if (!"node".equals(currentElement.optString("type"))) { continue; } // 读取经纬度,opt前缀方法字段不存在时会返回默认值,不会直接崩溃 double lat = currentElement.optDouble("lat", 0.0); double lon = currentElement.optDouble("lon", 0.0); // 读取tags下的name字段 String name = "未命名点位"; JSONObject tags = currentElement.optJSONObject("tags"); if (tags != null) { name = tags.optString("name", name); } // 此处可替换为你自己的业务逻辑,比如存入列表、数据库等 System.out.printf("点位名称:%s,纬度:%.6f,经度:%.6f%n", name, lat, lon); } } }
补充说明
推荐统一使用optXxx系列方法读取字段,相比直接用getXxx方法,optXxx在字段不存在、类型不匹配时会返回你指定的默认值,不会直接抛出异常中断整个遍历流程,更适配第三方接口返回的不确定结构数据。
内容的提问来源于stack exchange,提问作者KerryKilian
相关产品推荐
相关产品推荐

