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

JSON解析报错:Expected property name or '}'问题及解决求助

问题根源与解决思路

你的报错原因很明确:JSON语法强制要求属性名和字符串值必须使用双引号,但数据库里存储的字符串用的是单引号,这直接导致JSON.parse无法识别合法的JSON结构。

直接解决方案(针对当前场景)

1. 全局替换单引号为双引号

如果你的属性值里没有单引号(比如示例中的内容),可以直接把字符串里所有单引号替换成双引号,再解析:

metaData.meta_data.attributes.forEach((attribute: string) => {
    try {
        // 替换所有单引号为双引号,生成合法JSON
        const validJsonStr = attribute.replace(/'/g, '"');
        const parsedObj = JSON.parse(validJsonStr);
        console.log(parsedObj);
        console.log(Object.keys(parsedObj)); // 现在可以正常获取属性键了
    } catch (err) {
        console.error('解析失败:', err, '原始内容:', attribute);
    }
});

2. 处理属性值含单引号的特殊情况

如果属性值里存在单引号(比如'Description': 'I'm a ring'),直接全局替换会破坏内容,这时候需要先转义内容里的单引号,再替换属性名的单引号:

metaData.meta_data.attributes.forEach((attribute: string) => {
    try {
        // 先转义字符串内容中的单引号(非属性名的单引号)
        const escapedStr = attribute.replace(/(?<=: )'(?=.*')/g, '\\"');
        // 再把属性名的单引号替换成双引号
        const validJsonStr = escapedStr.replace(/'/g, '"');
        const parsedObj = JSON.parse(validJsonStr);
        console.log(parsedObj);
    } catch (err) {
        console.error('解析失败:', err, '原始内容:', attribute);
    }
});

3. 慎用eval(仅可信数据场景)

如果数据是完全可信的(比如自己系统生成、无恶意注入风险),可以用eval直接解析单引号格式的对象字面量:

metaData.meta_data.attributes.forEach((attribute: string) => {
    try {
        // 注意加括号包裹,避免解析错误
        const parsedObj = eval(`(${attribute})`);
        console.log(parsedObj);
        console.log(Object.keys(parsedObj));
    } catch (err) {
        console.error('解析失败:', err);
    }
});

⚠️ 注意:eval会执行字符串中的任意代码,若数据不可信(比如用户输入),绝对不能用,存在严重安全风险。

长远解决方案

从根源解决问题:存入数据库时确保存储标准JSON格式(用JSON.stringify将对象转为标准JSON字符串再存入),这样后续读取后直接用JSON.parse解析即可,不会出现此类兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:35:27