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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:27:06