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

JS使用JSON.parse读取JSON文件报Unexpected token B错误如何解决

错误产生原因

JSON.parse()的入参要求是符合JSON语法规范的字符串,当前代码完全没有执行「读取文件内容」的操作,只是把文件名本身"3BP-OOP-PFR.json"这个普通字符串传给了JSON.parse去解析。
这个字符串开头为3B,不符合JSON语法规则:合法JSON的起始字符只能是{(对象)、[(数组)、"(字符串值)、数字、t/f/n(对应true/false/null),解析器读到索引位置1(即第二个字符)的B时无法识别语法,直接抛出Unexpected token B in JSON at position 1的异常。

修复方案

根据代码运行的环境选择对应的读取方式,针对大型JSON文件优先选择流式解析方案,避免一次性加载全量文件占用过高内存。

浏览器环境

浏览器受安全策略限制,不能直接通过路径读取本地磁盘文件,分两种常见场景处理:

  • 加载部署在服务端的JSON文件:
fetch('3BP-OOP-PFR.json')
  .then(res => {
    if (!res.ok) throw new Error('文件加载失败,检查路径是否正确');
    return res.json(); // 内置方法自动完成JSON解析,无需手动调用JSON.parse
  })
  .then(jsonFile => {
    console.log(jsonFile); // 此处拿到解析完成的JSON对象
  })
  .catch(err => console.error(err));
  • 读取用户手动选择的本地JSON文件:
// 页面中放置文件选择控件:<input type="file" id="jsonFileInput" accept=".json">
const fileInput = document.getElementById('jsonFileInput');
fileInput.addEventListener('change', (e) => {
  const selectedFile = e.target.files[0];
  selectedFile.text().then(fileText => {
    const jsonFile = JSON.parse(fileText);
    console.log(jsonFile);
  })
})

Node.js环境

Node.js可以直接访问本地文件系统,小文件和大文件对应不同处理方式:

  • 小型JSON文件简单读取:
const fs = require('fs/promises');
async function loadJson() {
  // 先读取文件文本内容,再做JSON解析
  const fileContent = await fs.readFile('3BP-OOP-PFR.json', 'utf8');
  const jsonFile = JSON.parse(fileContent);
  console.log(jsonFile);
}
loadJson();

// 固定不变的JSON文件也可以直接用require导入,注意该方式会缓存文件内容
// const jsonFile = require('./3BP-OOP-PFR.json');
// console.log(jsonFile);
  • 大型JSON文件流式解析(避免内存溢出):
    借助流式解析能力逐段处理文件内容,不需要把整个文件全部加载到内存:
// 先安装依赖:npm i stream-json
const fs = require('fs');
const { parser } = require('stream-json');
const { streamArray } = require('stream-json/streamers/StreamArray');

const readStream = fs.createReadStream('3BP-OOP-PFR.json', 'utf8')
  .pipe(parser())
  .pipe(streamArray());

// 逐块处理JSON数据
readStream.on('data', ({key, value}) => {
  console.log('当前处理条目索引:', key);
  // 业务逻辑处理单条value数据
});
readStream.on('end', () => {
  console.log('JSON文件解析完成');
});
readStream.on('error', err => console.error('解析出错:', err));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:09:33