← 返回工具首页

什么是 Unexpected Token JSON 错误?

Unexpected Token 是 JavaScript 语法解析错误的一种,表示解析器在期望某个特定 token(符号)时遇到了意外的字符。放在 JSON 语境里,通常是 Unexpected token in JSON,说明你试图解析的内容不是合法 JSON。

// 典型报错
// Chrome: SyntaxError: Unexpected token 'x', ... is not valid JSON
// Firefox: SyntaxError: JSON.parse: expected ',' or '}' after property value

const data = JSON.parse('{"name": "Clover" genre: "music"}');
//                          ↑ 少了逗号,parser 遇到了意外的 token 'genre'

const bad = JSON.parse("{'name': 'Clover'}");
//                          ↑ JSON 只接受双引号,单引号是意外的 token

Unexpected Token 的 6 大常见原因

原因 1:少了逗号分隔符

// ❌ 错误:两个属性之间没有逗号
{"name": "Clover", "age": 16 "city": "Beijing"}

// ✅ 正确
{"name": "Clover", "age": 16, "city": "Beijing"}

// 数组元素之间也同理
[1, 2 3]     // ❌ 少了逗号
[1, 2, 3]    // ✅ 正确

原因 2:字符串用了单引号

// ❌ 错误
JSON.parse("{'name': 'Clover'}");

// ✅ 正确
JSON.parse('{"name": "Clover"}');

原因 3:键没有引号(JSON5/JS对象写法,不是 JSON)

// ❌ 这不是 JSON,这是 JavaScript 对象字面量
JSON.parse('{name: "Clover", age: 16}');

// ✅ 真正的 JSON:键必须加引号
JSON.parse('{"name": "Clover", "age": 16}');

原因 4:数组或对象括号不匹配

// ❌ 括号没闭合
JSON.parse('{"items": [1, 2, 3}');
//                                ^ 期望 ] 但遇到了 }
JSON.parse('{"data": {"ok": true}');
//                                   ^ 多余 } 或少了 ,

// ✅ 正确
JSON.parse('{"items": [1, 2, 3]}');
JSON.parse('{"data": {"ok": true}}');

原因 5:数字写了非数字值

// ❌ JSON 没有 undefined、NaN、Infinity
JSON.parse('{"val": undefined}');
JSON.parse('{"val": NaN}');
JSON.parse('{"ratio": +Infinity}');

// ✅ 正确:null 用于表示"空"
JSON.parse('{"val": null}');
JSON.parse('{"ratio": 0}');

原因 6:BOM 或其他隐藏字符

// 文件被保存为 UTF-8 with BOM,前面多了 \uFEFF
// 导致解析时报 Unexpected token
const raw = '\uFEFF{"ok": true}';
JSON.parse(raw);  // Unexpected token

// 清理 BOM
JSON.parse(raw.replace(/^\uFEFF/, ''));  // OK

网络请求返回 unexpected token 怎么办?

从接口拿到的数据报 unexpected token,通常是以下几个原因:

1. 接口返回了 HTML 错误页(最常见)

fetch('/api/user/123')
    .then(r => r.text())  // 先拿原始文本
    .then(text => {
        console.log('原始响应:', text.slice(0, 200));
        // 如果打印出来是 "..." 或 "Not Found",说明接口本身报错了
        // 不是 JSON 格式,自然解析失败
    });

2. 响应被 gzip 压缩了但没解压

// 如果服务器返回了 gzip 压缩的数据,但前端没解压
// 直接 JSON.parse 压缩后的乱码 → unexpected token

// 解决:fetch 自动处理 gzip,但如果用了其他 HTTP 库,检查是否配置了解压
// axios 会自动解压,request 库需要加 'gzip: true'
const r = await fetch(url, {
    headers: { 'Accept-Encoding': 'gzip, deflate, br' }
    // 现代浏览器 fetch 会自动处理
});

3. 接口返回了空内容

// 接口 204 No Content 时,body 是空的
// JSON.parse('') → Unexpected end of JSON input
fetch('/api/delete/123', {method: 'DELETE'})
    .then(async r => {
        if (r.status === 204) return null;  // 204 没有 body
        return r.json();
    });

快速定位错误的调试技巧

用 JSON Validator 高亮错误位置

复制你的 JSON 字符串到 JSON 校验工具,它会告诉你具体哪一行、哪个字符出了问题。

用浏览器 DevTools 调试

// 在 Console 里直接测试
const testStr = '{"name": "测试"}';  // 你的 JSON 字符串
console.log(JSON.parse(testStr));

// 用 try-catch 包装,打印详细信息
try {
    JSON.parse(badStr);
} catch (e) {
    console.log('错误类型:', e.name);
    console.log('错误信息:', e.message);
    // 浏览器会显示出错字符的位置
}

用在线 JSON Formatter

防止 Unexpected Token 的编程习惯

// 1. 后端统一用 JSON.stringify 输出,不要手动拼接字符串
// ❌ 危险:手动拼接可能产生不合法的 JSON
const bad = '{"name": "' + userName + '"}';
// 如果 userName 里有 " 或 换行符,就崩了

// ✅ 安全:始终用 JSON.stringify
const good = JSON.stringify({name: userName});

// 2. 前端解析时用 try-catch
function fetchJson(url) {
    return fetch(url)
        .then(r => {
            if (!r.ok) throw new Error(`HTTP ${r.status}`);
            return r.text();  // 先拿文本,检查一下
        })
        .then(text => {
            try {
                return JSON.parse(text);
            } catch (e) {
                console.error('JSON解析失败,原始内容:', text.slice(0, 500));
                throw e;
            }
        });
}

// 3. 用 schema 校验(关键数据)
const Ajv = require('ajv');
const ajv = new Ajv();
const schema = {
    type: 'object',
    required: ['id', 'name'],
    properties: {
        id: {type: 'integer'},
        name: {type: 'string'}
    }
};
const validate = ajv.compile(schema);
const valid = validate(data);
if (!valid) console.error(validate.errors);

总结

错误类型原因解决方案
Unexpected token ' in JSON用了单引号全部换成双引号
Unexpected token n写了 undefined/NaN用 null 代替
Unexpected token u写了 undefinednull 代替
Unexpected token <接口返回 HTML 而非 JSON检查 HTTP 状态码和 Content-Type
Unexpected end of JSON响应为空或被截断检查网络或接口是否正常

💡 遇到同类问题?用工具快速解决

试试这些配套工具,无需注册,打开即用

JSON 格式化

常见问题

Q: 遇到 unexpected-token-json错误怎么解决,是什么原因导致的?
A: 常见原因有:数据格式不符合规范(如 JSON 多了逗号或少了引号)、字符编码不统一(UTF-8 和 GBK 混用)、特殊字符未正确转义,或接口返回了非标准数据。先用工具验证格式是最快的排查方式。
Q: unexpected-token-json错误怎么解决 会影响程序正常运行吗?
A: 会的。格式错误会导致数据无法正常解析,轻则功能异常,重则程序崩溃。尤其是涉及支付、用户输入等关键流程时,这类问题必须第一时间修复。
Q: unexpected-token-json错误怎么解决 有没有自动修复的办法?
A: 大多数格式问题可以用在线工具自动修复。如果是自己生成的 JSON/编码数据,修复后再重新提交即可;如果是第三方接口返回的格式问题,则需要联系对方修正或做容错处理。
Q: 修复后还需要注意什么?
A: 建议增加格式校验环节,在数据提交前或接收后先做格式验证(用 JSON.parse 或对应工具),避免再次出现同样问题。同时统一前后端编码规范,从源头减少这类错误。