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

Node.js JSON解析异常:读取JSON文件后结果为字符串而非对象

问题分析与解决方案

兄弟,我太懂你遇到的这个坑了——明明读了JSON文件,用JSON.parse()处理完居然还是字符串类型,这确实让人挠头。咱们一步步拆解问题,把它搞定:

常见原因&对应解决办法

1. 文件读取时没指定编码,拿到的是Buffer而非字符串

如果用fs模块读取文件时没加'utf8'编码参数,你拿到的其实是Buffer对象,这时候直接解析很容易出问题。比如:

const fs = require('fs');
// 错误示例:没指定编码,得到的是Buffer
const fileContent = fs.readFileSync('./users.json');
const parsed = JSON.parse(fileContent); // 这里会隐式转字符串,但容易出意外

正确做法:指定编码直接拿到字符串

const fs = require('fs');
const fileContent = fs.readFileSync('./users.json', 'utf8');
const userObj = JSON.parse(fileContent);
console.log(typeof userObj); // 现在应该是object了

2. JSON文件本身是「字符串化后的JSON」(套了一层引号)

比如你的JSON文件内容其实是带外层引号的,像这样:

"{ "21154535154122752": { "username": "Stanislav", ... }}"

这种情况是文件本身就把JSON对象又转成字符串存进去了,所以第一次解析后得到的还是字符串,需要再解析一次:

const fs = require('fs');
const fileContent = fs.readFileSync('./users.json', 'utf8');
// 第一次解析拿到字符串,第二次解析才拿到真正的对象
const userObj = JSON.parse(JSON.parse(fileContent));
console.log(typeof userObj); // object

你可以先打印fileContent看看是不是带外层引号,一查就明白。

3. 异步读取时没处理好时机

如果你用的是fs.readFile()异步方法,没在回调里正确处理逻辑,提前去解析还没拿到的内容,也会出问题。比如:

// 错误示例:异步操作没完成就解析
const fs = require('fs');
let fileContent;
fs.readFile('./users.json', 'utf8', (err, data) => {
  if (err) throw err;
  fileContent = data;
});
const userObj = JSON.parse(fileContent); // 这里fileContent还没赋值,大概率出错

正确的异步处理:

const fs = require('fs');
fs.readFile('./users.json', 'utf8', (err, data) => {
  if (err) {
    console.error('读取文件出错:', err);
    return;
  }
  try {
    const userObj = JSON.parse(data);
    console.log(typeof userObj); // object
    // 在这里处理你的对象逻辑
  } catch (parseErr) {
    console.error('JSON解析出错:', parseErr);
  }
});

或者用Promise版本更优雅:

const fs = require('fs').promises;
async function getUserData() {
  try {
    const fileContent = await fs.readFile('./users.json', 'utf8');
    const userObj = JSON.parse(fileContent);
    console.log(typeof userObj); // object
    return userObj;
  } catch (err) {
    console.error('出错了:', err);
  }
}
getUserData();

4. JSON文件格式有语法错误

如果JSON文件里有语法问题(比如漏了逗号、引号不匹配),JSON.parse()会抛出错误,但有时候错误隐蔽会返回奇怪结果。加个try-catch就能快速排查:

try {
  const userObj = JSON.parse(fileContent);
  console.log(typeof userObj);
} catch (err) {
  console.log('JSON解析失败:', err.message);
}

快速排查步骤

  1. 先打印fileContent的内容和类型,确认是不是正确的字符串、有没有外层引号;
  2. 检查JSON文件格式是否正确,比如直接在浏览器控制台粘贴内容测试解析;
  3. 确认读取文件时是否指定编码,异步操作是否在回调/await后处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:02:36