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

读取JSON文件时Ciudad对象内容为空的问题排查

问题分析与修复方案

1. JSON结构层级不匹配

你的JSON最外层包含一个ciudad对象,所有数据都嵌套在这个对象内部,但代码直接从根JSON对象获取colonias、enlaces、centrales字段,导致返回null,最终Ciudad的所有列表都为空。

2. 数值类型不兼容

JSON中部分数值字段是字符串格式(比如coordenadaX: "100"、x: "200"),但代码里直接强制转换为Long,会触发ClassCastException,中断数据解析流程。


修复后的代码

调整JSON解析层级

在cargarCiudadDesdeJSON方法中,先获取内部的ciudad子对象,再从中读取对应数组:

public static Ciudad cargarCiudadDesdeJSON(String rutaArchivo) {
    JSONParser parser = new JSONParser();

    try (BufferedReader reader = new BufferedReader(new FileReader(rutaArchivo))) {
        Object obj = parser.parse(reader);
        JSONObject rootJSON = (JSONObject) obj;
        // 先获取嵌套的ciudad对象
        JSONObject ciudadJSON = (JSONObject) rootJSON.get("ciudad");

        Ciudad ciudad = new Ciudad();
        ciudad.colonias = cargarColoniasDesdeJSON((JSONArray) ciudadJSON.get("colonias"));
        ciudad.enlaces = cargarEnlacesDesdeJSON((JSONArray) ciudadJSON.get("enlaces"));
        ciudad.centrales = cargarCentralesDesdeJSON((JSONArray) ciudadJSON.get("centrales"));

        return ciudad;
    } catch (IOException | ParseException e) {
        e.printStackTrace();
    }

    return null;
}

修复类型转换问题

对于JSON中字符串格式的数值,先转为String再解析为Long:

修复cargarColoniasDesdeJSON方法

private static List<Colonia> cargarColoniasDesdeJSON(JSONArray coloniasJSON) {
    List<Colonia> colonias = new ArrayList<>();

    for (Object coloniaObj : coloniasJSON) {
        JSONObject coloniaJSON = (JSONObject) coloniaObj;
        String nombre = (String) coloniaJSON.get("nombre");
        // 字符串格式数值先转String再解析为Long
        long coordenadaX = Long.parseLong((String) coloniaJSON.get("coordenadaX"));
        // coordenadaY是数字类型,直接转Long
        long coordenadaY = (Long) coloniaJSON.get("coordenadaY");

        Colonia colonia = new Colonia(nombre, coordenadaX, coordenadaY);
        colonias.add(colonia);
    }

    return colonias;
}

修复cargarCentralesDesdeJSON方法

private static List<Central> cargarCentralesDesdeJSON(JSONArray centralesJSON) {
    List<Central> centrales = new ArrayList<>();

    for (Object centralObj : centralesJSON) {
        JSONObject centralJSON = (JSONObject) centralObj;
        // 字符串格式数值转Long
        long x = Long.parseLong((String) centralJSON.get("x"));
        long y = Long.parseLong((String) centralJSON.get("y"));

        Central central = new Central(x, y);
        centrales.add(central);
    }

    return centrales;
}

可选优化:统一JSON数值格式

如果可以修改JSON文件,建议把所有数值字段改为数字类型(去掉引号),比如:

"coordenadaX": 100,
"x": 200

这样可以避免类型转换的额外操作,代码逻辑更简洁。

内容的提问来源于stack exchange,提问作者EmilianoBerrones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:22:34