使用Gson读写JSON文件时出现JSON Malformed Exception报错是什么原因?
问题根因
- JSON格式不符合语法规范
你生成的JSON文件存在多个顶层根元素,三个独立的数组并列不符合JSON语法要求,JSON规定整个文档只能有一个顶层对象/数组,这是触发JSON malformed错误的直接原因。 - 写入逻辑错误
你使用了追加模式(FileWriter第二个参数设为true)写入数据,每次新增用户时直接将单个用户的序列化内容拼到文件末尾,没有维护整个JSON数组的结构,最终形成了多数组拼接的非法格式。
修复方案
调整写入逻辑,不要直接追加内容:
- 每次新增用户前,先读取文件中已有的全部用户数据,反序列化为
User列表 - 将新用户添加到该列表中
- 把更新后的完整列表序列化为JSON,覆盖写入原文件,不要用追加模式
修复后的写入代码示例
Gson gsonObject = new Gson(); List<User> userList = new ArrayList<>(); File userFile = new File("users.json"); // 读取已有用户数据 if (userFile.exists() && userFile.length() > 0) { try (BufferedReader reader = new BufferedReader(new FileReader(userFile))) { User[] existUsers = gsonObject.fromJson(reader, User[].class); userList.addAll(Arrays.asList(existUsers)); } catch (IOException e) { e.printStackTrace(); } } // 添加新用户 userList.add(writerUser); // 覆盖写入全量用户数据 try (FileWriter writerFile = new FileWriter(userFile)) { writerFile.write(gsonObject.toJson(userList)); } catch (IOException e) { e.printStackTrace(); }
修改后生成的JSON为合法的单数组格式,你现有的读取代码可直接正常运行:
[{"name":"james","idCode":1},{"name":"kyle","idCode":2},{"name":"test","idCode":3}]
额外优化建议:使用try-with-resources语法管理文件流,可自动关闭资源,避免异常场景下的资源泄漏问题。
内容的提问来源于stack exchange,提问作者victorbnd
相关产品推荐
相关产品推荐

