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

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"
        }
    ]
}

问题根源

  1. 文件追加模式错误:使用FileOutputStream("data.json", true)会直接在文件末尾追加新JSON对象,导致文件出现多个独立的JSON根节点,属于无效JSON格式。
  2. 冗余逻辑干扰:代码中重复检查players键的逻辑完全多余,反而容易引发状态混乱。
  3. 未处理文件不存在场景:原方法仅在文件存在时执行逻辑,首次调用无法创建初始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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:35:16