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

Node.js使用fs.appendFile写入JSON文件如何将新对象插入数组内部?

Node.js 向JSON文件数组插入新元素的正确实现

错误原因

fs.appendFile 是直接在文件末尾追加二进制内容,不会识别JSON的结构化语法,因此会把新内容写到数组闭合方括号]的外侧,破坏原有JSON结构。标准JSON数组不能通过直接追加内容实现插入,必须先读取全量内容修改后再回写。

正确实现步骤

  1. 读取目标JSON文件的全量内容
  2. 将字符串内容反序列化为JavaScript数组
  3. 将新构造的数据对象推入数组末尾
  4. 将修改后的数组重新序列化后写入原文件

代码示例

回调版本(兼容旧版Node.js)

const fs = require('fs')
const filePath = './myJSONFile.json'

// 构造新数据对象
const newData = { id: id, name: name, city: city }

// 读取现有文件
fs.readFile(filePath, 'utf8', (readErr, data) => {
  if (readErr) throw readErr
  // 反序列化为数组
  const jsonArr = JSON.parse(data)
  // 插入新元素
  jsonArr.push(newData)
  // 序列化后回写,第三个参数控制缩进格式,和原有文件保持一致
  const updatedJson = JSON.stringify(jsonArr, null, 2)
  fs.writeFile(filePath, updatedJson, 'utf8', (writeErr) => {
    if (writeErr) throw writeErr
    console.log('Changed!')
  })
})

Promise版本(Node.js 14+ 推荐)

const fs = require('fs/promises')
const filePath = './myJSONFile.json'

async function appendJsonArray(newData) {
  // 读取并反序列化
  const fileContent = await fs.readFile(filePath, 'utf8')
  const jsonArr = JSON.parse(fileContent)
  // 插入新元素
  jsonArr.push(newData)
  // 回写文件
  await fs.writeFile(filePath, JSON.stringify(jsonArr, null, 2), 'utf8')
  console.log('Changed!')
}

// 调用方法
appendJsonArray({ id: id, name: name, city: city }).catch(err => { throw err })

注意事项

  • 如果需要处理文件不存在的场景,可以在读取报错时初始化一个空数组再写入
  • 高并发写入场景下需要加文件锁,避免多个写入操作同时修改文件导致内容损坏
  • 如果数据量非常大,建议改用JSON Lines格式(每行存储一个JSON对象),此时可以直接使用fs.appendFile追加新行,无需全量读写

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:27:01