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
相关产品推荐
相关产品推荐

