Node.js ES6中如何解析含未转义属性的类JSON字符串?
解决类JSON字符串的解析问题
首先,你遇到的问题很典型:这个字符串不是标准JSON,所以JSON.parse肯定会报错。标准JSON有严格的语法规则:
- 所有属性名必须用双引号包裹
- 字符串值必须用双引号包裹
- 只有
null/true/false和数字可以不用引号
你的字符串里属性名(比如prop1)没加引号,字符串值(比如SOME-VALUE、日期字符串)也没有引号,完全不符合标准JSON的要求,自然会触发语法错误。
下面给你两种可靠的解决思路:
思路1:手动转换为标准JSON(无依赖)
如果你的类JSON格式比较规范(比如值里没有逗号、括号这类特殊字符),可以用正则表达式把它转换成标准JSON,再用JSON.parse解析。
示例代码:
function convertToValidJson(classJsonStr) { // 第一步:给所有属性名加上双引号,把 prop= 替换为 "prop": let validJson = classJsonStr.replace(/(\w+)=/g, '"$1":'); // 第二步:给非关键字、非数字的字符串值加上双引号 validJson = validJson.replace(/:([^\s,\{\}\[\]]+)(?=[,\}\]])/g, (match, value) => { // 跳过null/true/false和数字类型的值 const allowedUnquoted = ['null', 'true', 'false']; if (allowedUnquoted.includes(value) || !isNaN(Number(value))) { return match; } // 其他情况给值加上双引号 return `:"${value}"`; }); return validJson; } // 使用示例 const A = "{prop1=null, prop2=SOME-VALUE, prop3=[{prop4=2018-04-13T19:07:47.008Z}]}"; try { const validJson = convertToValidJson(A); const parsedData = JSON.parse(validJson); console.log('解析结果:', parsedData); } catch (err) { console.error('转换或解析失败:', err.message); }
这种方法的优点是不需要额外安装依赖,但要注意:如果你的值里包含逗号、空格或者括号,正则可能会匹配出错,这时候就需要更复杂的处理逻辑。
思路2:使用宽松的JSON解析库(更可靠)
如果你的类JSON格式比较复杂,或者不想手动处理边缘情况,推荐使用专门支持宽松格式的解析库,比如jsonic——它专门用来解析这种类似JSON但语法更灵活的字符串。
步骤:
- 安装依赖:
npm install jsonic
- 解析示例:
const jsonic = require('jsonic'); const A = "{prop1=null, prop2=SOME-VALUE, prop3=[{prop4=2018-04-13T19:07:47.008Z}]}"; try { const parsedData = jsonic(A); console.log('解析结果:', parsedData); } catch (err) { console.error('解析失败:', err.message); }
jsonic支持无引号的属性名、无引号的字符串值(只要值不包含分隔符),甚至能处理一些更灵活的语法,比手动写正则更稳定。
⚠️ 注意:不要用原生的eval()来解析,因为如果字符串里包含恶意代码,eval()会直接执行,存在安全风险。即使是所谓的"安全eval"库,也可能因为值被当成变量而报错(比如SOME-VALUE会被识别为未定义的变量),不如专门的解析库可靠。
内容的提问来源于stack exchange,提问作者Tomasz GORKA
相关产品推荐
相关产品推荐

