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

Chrome扩展开发:读取用户上传JSON文件报错的解决方法

问题

开发Google Chrome扩展时,读取用户上传的JSON文件出现报错:

Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON

当前代码:

let selectedFile;

document.getElementById("cust").addEventListener('change',(event)=>{
        selectedFile = event.target.files[0];
        
} );

document.getElementById("send").addEventListener('click',()=>{
    if(selectedFile){
        const r = fetch(selectedFile);
        r.then(response => response.json())
        
        
        }
    }
 );

选中的文件对象信息:

File {name: 'customer.json', lastModified: 1672167660694, lastModifiedDate: Tue Dec 27 2022 22:01:00 GMT+0300 (GMT+03:00), webkitRelativePath: '', size: 2558, …}

JSON文件示例:

[
 {
  "First Name": "John",
  "Last Name": "Doe",
  "Email": "test@test.com"
  
 },
 {
  "First Name": "John2",
  "Last Name": "Doe2",
  "Email": "test2@test.com"
 },
 {
  "First Name": "John3",
  "Last Name": "Doe3",
  "Email": "tes3t@test.com",
 }
 ]

注:代码从URL获取JSON时可正常运行,询问如何修复报错。

修复方案

问题根源

fetch() API的作用是发起网络请求获取远程资源,不能直接传入本地File对象。当你把File对象传给fetch时,它会被当作相对URL去请求,结果返回的是浏览器的404或其他HTML页面,所以解析JSON时会遇到<开头的HTML内容,触发语法错误。

正确实现方式

应该使用FileReader API读取本地上传的文件,这是处理浏览器中本地文件的标准方法。修改后的代码如下:

let selectedFile;

document.getElementById("cust").addEventListener('change', (event) => {
    selectedFile = event.target.files[0];
});

document.getElementById("send").addEventListener('click', () => {
    if (selectedFile) {
        const reader = new FileReader();
        // 以文本形式读取文件内容
        reader.readAsText(selectedFile);
        
        // 文件读取完成后的回调
        reader.onload = function(e) {
            try {
                const jsonData = JSON.parse(e.target.result);
                // 此处处理解析后的JSON数据
                console.log(jsonData);
            } catch (err) {
                console.error('JSON解析失败:', err);
            }
        };
        
        // 文件读取错误处理
        reader.onerror = function(err) {
            console.error('文件读取错误:', err);
        };
    }
});

额外优化

你的JSON示例中最后一个对象的Email字段后多了一个多余的逗号:

{
  "First Name": "John3",
  "Last Name": "Doe3",
  "Email": "tes3t@test.com", // 此处逗号需移除
}

虽然部分JSON解析器能容忍这种尾逗号,但严格来说不符合JSON规范,建议移除以避免潜在的解析问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:05:41