
本文介绍在 cypress 中向 json 文件安全追加对象的正确方法,避免因直接使用追加模式(a+)导致 json 格式损坏的问题,并提供可立即使用的代码示例。
本文介绍在 cypress 中向 json 文件安全追加对象的正确方法,避免因直接使用追加模式(a+)导致 json 格式损坏的问题,并提供可立即使用的代码示例。
在 Cypress 中,许多开发者尝试通过 cy.writeFile(..., { flag: 'a+' }) 直接向 JSON 文件末尾追加新对象,期望得到类似 [{}, {}, {}] 的数组结构。但这种方式存在根本性问题:JSON 是一种结构化数据格式,而非纯文本日志;flag: 'a+' 仅适用于追加无结构的文本流(如日志行),它会在文件末尾直接写入字符串,而不会解析、修改或重写原有 JSON 结构——结果往往导致非法 JSON,例如缺少逗号分隔、括号不匹配或嵌套错误,最终使 cy.readFile() 后续读取失败。
✅ 正确做法是:先读取完整 JSON 数组 → 在内存中用 JavaScript 推入新对象 → 全量重写文件。这确保了 JSON 始终合法、可解析且结构一致。
以下为推荐实现:
const filePath = 'cypress/fixtures/xlsxData.json';
// 确保初始文件存在且为合法空数组(首次运行时)
cy.readFile(filePath, { timeout: 5000 })
.then((data) => {
// 若文件为空或非数组,初始化为 []
const jsonData = Array.isArray(data) ? data : [];
const Newdata = {
FirstName: F_jsonData[i][0],
MiddleName: F_jsonData[i][1],
LastName: F_jsonData[i][2]
};
jsonData.push(Newdata);
return cy.writeFile(filePath, jsonData); // 全量写入更新后的数组
})
.catch((err) => {
// 文件不存在时,创建带新数据的初始数组
if (err.message.includes('ENOENT')) {
const initialData = [{
FirstName: F_jsonData[i][0],
MiddleName: F_jsonData[i][1],
LastName: F_jsonData[i][2]
}];
cy.writeFile(filePath, initialData);
} else {
throw err;
}
});
? 关键注意事项:
- ✅ 始终通过 cy.readFile() 加载现有数据,再操作数组,而非依赖文件追加;
- ✅ 使用 Array.isArray() 容错处理,防止初始文件为空、损坏或非数组内容;
- ❌ 禁止对 JSON 文件使用 flag: 'a+',该标志会破坏 JSON 语法完整性;
- ? 若需并发写入(如循环中多次调用),建议封装为自定义命令并添加锁机制,或改用单次批量写入以提升可靠性与性能。
通过此方式,生成的 xlsxData.json 将始终是标准、可解析的 JSON 数组,例如:
[
{
"FirstName": "ABC",
"MiddleName": "K",
"LastName": "edf"
},
{
"FirstName": "sss",
"MiddleName": "g",
"LastName": "efg"
}
]
结构清晰、兼容所有后续 cy.fixture() 或 cy.readFile() 操作,真正实现稳健的数据持久化。











