Java中使用JSONObject添加对象时数据被覆盖的问题
解决Java生成JSON时旧数据被覆盖的问题
问题根源
- 每次调用
addUser时,FileWriter默认以覆盖模式打开文件,直接清空原有内容写入新数据 - 每次都创建全新的
JSONObject,仅添加当前用户,未读取复用已存在的用户数据 - 你期望的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
相关产品推荐
相关产品推荐

