Java写入JSON文件重复生成players键问题求助
问题描述
调用addPlayer方法写入data.json时,每次都会生成独立的含players键的JSON对象,无法将新玩家追加到同一个players数组中。
预期JSON结果
{ "players": [ { "current_Energy": 100, "level": 1, "name": "tenente", "experiencePoints": 0, "team": "Giants" }, { "current_Energy": 100, "level": 1, "name": "tenente", "experiencePoints": 0, "team": "Giants" }, { "current_Energy": 100, "level": 1, "name": "tenente", "experiencePoints": 0, "team": "Giants" } ] }
当前错误JSON结果
{ "players": [ { "current_Energy": 100, "level": 1, "name": "tenente", "experiencePoints": 0, "team": "Giants" }, { "current_Energy": 100, "level": 1, "name": "tenente", "experiencePoints": 0, "team": "Giants" }, { "current_Energy": 100, "level": 1, "name": "tenente", "experiencePoints": 0, "team": "Giants" } ] } { "players": [ { "current_Energy": 100, "level": 1, "name": "tenente", "experiencePoints": 0, "team": "Giants" }, { "current_Energy": 100, "level": 1, "name": "tenente", "experiencePoints": 0, "team": "Giants" }, { "current_Energy": 100, "level": 1, "name": "tenente", "experiencePoints": 0, "team": "Giants" } ] }
问题根源
- 文件追加模式错误:使用
FileOutputStream("data.json", true)会直接在文件末尾追加新JSON对象,导致文件出现多个独立的JSON根节点,属于无效JSON格式。 - 冗余逻辑干扰:代码中重复检查
players键的逻辑完全多余,反而容易引发状态混乱。 - 未处理文件不存在场景:原方法仅在文件存在时执行逻辑,首次调用无法创建初始JSON结构。
修复后的代码
public void addPlayer(PlayerManager playerManager) { JSONObject jsonObject = new JSONObject(); JSONArray jsonArray = new JSONArray(); ArrayUnorderedList<Players> dataplayer = playerManager.getPlayersList(); // 读取现有文件内容(若存在) if (file.exists()) { try { jsonObject = (JSONObject) new JSONParser().parse(new FileReader(file)); jsonArray = jsonObject.getJSONArray("players"); } catch (ParseException | IOException e) { // 解析失败时重置为新数组 jsonArray = new JSONArray(); } } // 批量添加新玩家到数组 for (Players player : dataplayer) { JSONObject playerObject = new JSONObject(); playerObject.put("name", player.getName()); playerObject.put("team", player.getTeam().toString()); playerObject.put("level", player.getLevel()); playerObject.put("experiencePoints", player.getExperiencePoints()); playerObject.put("current_Energy", player.getCurrentEnergy()); jsonArray.add(playerObject); } // 覆盖写入文件,确保单一JSON根对象 try (PrintStream printStream = new PrintStream(new FileOutputStream("data.json"))) { jsonObject.put("players", jsonArray); printStream.println(jsonObject.toJSONString(4)); // 格式化输出,提升可读性 } catch (IOException e) { e.printStackTrace(); } }
关键修复点
- 修改写入模式:去掉
FileOutputStream的追加参数true,使用覆盖模式写入,保证文件始终只有一个有效JSON根对象。 - 简化读取逻辑:直接读取现有JSON并获取
players数组,解析失败时自动初始化新数组。 - 兼容初始场景:无论文件是否存在,都执行写入逻辑,首次调用会自动创建包含
players数组的JSON结构。 - 格式化输出:用
toJSONString(4)生成带缩进的JSON,方便后续查看和维护。
内容的提问来源于stack exchange,提问作者Nicolas Sousa
相关产品推荐
相关产品推荐

