读取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
相关产品推荐
相关产品推荐

