读取JSON文件提取名称存入List却返回空列表的问题求助
问题分析与解决
核心问题
- JSON格式不合法:JSON对象不允许存在重复键(
name),多数JSON解析库遇到重复键时只会保留最后一个键值对,甚至直接解析失败,这是拿不到数据的根本原因。 - 代码逻辑错误:
- 若
datasource未初始化,调用add会触发空指针异常;即便初始化了空列表,循环逻辑也不对——jsonObject.length()返回的是对象中唯一键的数量(重复键会被合并,此处实际为1),且循环里每次添加的都是同一个name值,无法获取全部数据。
- 若
修正步骤
第一步:修正JSON格式
将重复键结构改成合法的JSON数组,两种可选格式:
格式1:用数组存储所有名称
{ "names": [ "Luis Lopez", "Armando Guascogne Ursular", "Brancar Diego" ] }
格式2:用对象数组存储每个带name的对象
[ {"name": "Luis Lopez"}, {"name": "Armando Guascogne Ursular"}, {"name": "Brancar Diego"} ]
第二步:修正Java代码
根据选择的JSON格式,使用对应解析逻辑:
对应格式1的代码
public List<String> getName() { // 初始化列表,避免空指针 List<String> datasource = new ArrayList<>(); try { Object obj = parser.parse(new FileReader("mypath\\name.json")); JSONObject jsonObject = (JSONObject) obj; // 获取names数组 JSONArray namesArray = (JSONArray) jsonObject.get("names"); // 遍历数组提取每个名称 for (int i = 0; i < namesArray.length(); i++) { String name = (String) namesArray.get(i); datasource.add(name); } } catch (Exception e) { e.printStackTrace(); } return datasource; }
对应格式2的代码
public List<String> getName() { List<String> datasource = new ArrayList<>(); try { Object obj = parser.parse(new FileReader("mypath\\name.json")); // 直接解析为JSON数组 JSONArray jsonArray = (JSONArray) obj; for (int i = 0; i < jsonArray.length(); i++) { // 遍历每个对象,提取name字段 JSONObject item = (JSONObject) jsonArray.get(i); String name = (String) item.get("name"); datasource.add(name); } } catch (Exception e) { e.printStackTrace(); } return datasource; }
额外说明
- 确保所用JSON解析库(如org.json)已正确引入项目依赖。
- 路径
mypath\\name.json可改用正斜杠mypath/name.json,避免Windows路径的转义问题。
内容的提问来源于stack exchange,提问作者Jacket
相关产品推荐
相关产品推荐

