为什么this.responseText无法返回JSON对象,读取属性返回undefined?
问题原因
this.responseText是字符串类型,本身不包含JSON对象的属性,所以直接读取.testName1必然返回undefined,通过下标访问只能拿到对应位置的字符属于字符串的正常特性。JSON.parse报位置1存在意外令牌的错误,绝大多数情况是返回的字符串开头存在不可见的冗余字符:常见的包括JSON文件保存时带的UTF-8 BOM头、多余的空格/换行符、服务端返回时额外输出的内容,也可能是直接使用file协议打开本地HTML时,读取JSON文件出现的格式异常。
修复步骤
- 先排查原始返回内容是否存在冗余字符,在解析前打印原始内容的转义结果:
console.log('原始返回转义结果:', JSON.stringify(this.responseText))
如果输出结果开头存在\uFEFF即为BOM头,存在多余的\n/\s即为空白字符,对应处理即可。
- 替换你的AJAX回调逻辑,增加容错处理:
request.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { // 移除BOM头和前后空白字符 const rawRes = this.responseText.trim().replace(/^\uFEFF/, '') try { const data = JSON.parse(rawRes) document.querySelector(".form3").innerHTML = rawRes + data.testName1 } catch (e) { console.error('JSON解析错误:', e, '异常内容:', rawRes) } } }
- 调整运行环境:不要直接用浏览器打开本地HTML文件(file://协议),使用本地静态服务运行项目,比如VS Code的Live Server插件、Node.js的http-server工具,避免本地文件读取的权限和格式异常。
- 确认
fakeData.json的保存格式:选择UTF-8 无BOM编码保存,不要在JSON文件内添加任何注释,JSON标准不支持注释语法。
内容的提问来源于stack exchange,提问作者Bryan Petko
相关产品推荐
相关产品推荐

