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

Java中使用JSONObject添加对象时数据被覆盖的问题

解决Java生成JSON时旧数据被覆盖的问题

问题根源

  1. 每次调用addUser时,FileWriter默认以覆盖模式打开文件,直接清空原有内容写入新数据
  2. 每次都创建全新的JSONObject,仅添加当前用户,未读取复用已存在的用户数据
  3. 你期望的JSON格式存在语法错误:JSON对象不允许重复键(多个"user"键),这种格式不符合JSON规范,多数解析器会忽略后续重复键值对

正确解决方案

第一步:调整JSON结构

改用users数组存储所有用户,合法的JSON格式如下:

{
  "users": [
    {
      "name": "John",
      "score": "10",
      "type": "star"
    },
    {
      "name": "Kevin",
      "score": "20",
      "type": "energy"
    }
  ]
}

第二步:修改代码逻辑

每次调用addUser时,先读取已有文件的内容(若文件存在),合并旧数据后再写入文件,同时处理流的自动关闭:

import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class UserManager { // 替换为你的实际类名
    private static final String JSON_FILE = "exit.json";

    public void addUser(String name, String score, String type) {
        JSONObject root = new JSONObject();
        JSONArray users = new JSONArray();

        // 读取已存在的用户数据
        File file = new File(JSON_FILE);
        if (file.exists() && file.length() > 0) {
            try (FileReader reader = new FileReader(file)) {
                root = new JSONObject(new String(reader.readAllBytes()));
                users = root.optJSONArray("users");
                if (users == null) {
                    users = new JSONArray();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // 添加新用户到数组
        JSONObject newUser = new JSONObject();
        newUser.put("name", name);
        newUser.put("score", score);
        newUser.put("type", type);
        users.put(newUser);

        // 更新根对象并写入文件
        root.put("users", users);
        try (FileWriter writer = new FileWriter(JSON_FILE)) {
            writer.write(root.toString(4)); // 带缩进,方便查看
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键改动说明

  • 读取已有文件内容,解析为JSON对象,保留历史用户数据
  • 用JSONArray存储多个用户,避免JSON重复键的语法问题
  • 使用try-with-resources自动关闭文件流,避免资源泄漏
  • 写入时生成格式化后的JSON,提升可读性

注意事项

不要使用重复键的JSON格式,这会导致解析异常或数据丢失,所有主流JSON解析器(如org.json、Jackson、Gson)都不支持重复键的正确处理。

内容的提问来源于stack exchange,提问作者João Xavier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:05:19