如何将无引号键值的字符串转换为可被JSON.parse解析的有效JSON?
解决无引号字符串转有效JSON的问题
我之前也碰到过一模一样的困扰——这种半结构化的手写字符串完全不符合JSON规范,手动加引号根本不现实,尤其数据量一大简直要命。别慌,咱们用正则表达式就能批量补上双引号,把它转成能被JSON.parse()正常解析的格式。
核心思路
JSON的规则很清晰:所有键必须是双引号包裹的字符串,字符串类型的值也必须用双引号包裹。咱们的目标就是用正则精准匹配那些没加引号的键和值,自动补上引号,同时兼顾数值类型的值(避免把数字也转成字符串)。
具体实现代码
针对你给出的示例字符串,直接用这段代码就能解决问题:
const string = "[{foo:bar,key:value},{foo:bar,key:value}]"; // 第一步:给所有键名添加双引号 let validJsonString = string.replace(/([a-zA-Z0-9_]+):/g, '"$1":'); // 第二步:给字符串值加引号,数值类型保持原样 validJsonString = validJsonString.replace(/:([^,}]+)([,}])/g, (match, value, end) => { const trimmedVal = value.trim(); // 判断是否为有效数字(包括整数、浮点数) if (!isNaN(Number(trimmedVal)) && trimmedVal !== '') { return `:${trimmedVal}${end}`; } else { return `:"${trimmedVal}"${end}`; } }); // 测试解析 try { const parsedData = JSON.parse(validJsonString); console.log('解析成功:', parsedData); } catch (error) { console.error('解析失败:', error.message); }
正则逻辑说明
匹配键名的正则:
/([a-zA-Z0-9_]+):/g- 专门匹配由字母、数字、下划线组成的键名(比如
foo、key),后面紧跟冒号的结构 - 替换成
"$1":,把键名用双引号包裹,符合JSON键的要求
- 专门匹配由字母、数字、下划线组成的键名(比如
匹配值的正则:
/:([^,}]+)([,}])/g- 匹配冒号之后、逗号或大括号之前的内容(也就是每个键对应的值)
- 通过回调函数判断值的类型:如果是有效数字就保持原样,否则给值加上双引号,避免把数值错误转成字符串
额外注意点
- 如果你的值里包含空格、
-、@这类特殊字符,可以把正则里的[^,}]+改成[^,}]*,能匹配更多字符 - 如果字符串里有嵌套对象/数组,这个简单正则可能处理不了,这时候可以考虑用
json5这类支持非标准JSON的库(不过如果不想引入第三方依赖,就得写更复杂的正则或者手动处理嵌套逻辑)
内容的提问来源于stack exchange,提问作者fooo
相关产品推荐
相关产品推荐

