JavaScript如何解析非严格类JSON字符串?求自定义解析实现方法
实现自定义解析器处理非严格类JSON字符串
问题描述
用户输入的字符串类似JSON但不符合严格规范,比如键名和字符串值未用双引号包裹,示例如下:
const input = `name: John, age: 20, products: [ { id : 100, name: flower }, { id : 101, name: snack }, ], home: New York, education: { highSchool: { name: Stuyvesant High School, GPA: 3.2 }, college: { name: Fordham University, GPA: 2.8 } }`;
这段内容无法通过JSON.parse()解析,需要实现customParser函数将其转换为合法的JavaScript对象,预期输出如下:
{ name: "John", age: 20, products: [{ id: 100, name: "flower" }, { id: 101, name: "snack" }], home: "New York", education: { highSchool: { name: "Stuyvesant High School", GPA: 3.2 }, college: { name: "Fordham University", GPA: 2.8 } } }
解决方案:正则修正+原生JSON.parse
通过正则表达式将非严格格式转换为合法JSON,再调用原生JSON.parse解析,这种方式简单高效,适合大多数常见场景。
实现代码
function customParser(input) { // 1. 为所有键名添加双引号 let validJson = input.replace(/\b([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:/g, '"$1":'); // 2. 为字符串值添加双引号(排除数字、true/false/null) validJson = validJson.replace(/:\s*([a-zA-Z][a-zA-Z0-9\s]*)(?=[,\}\]])/g, ': "$1"'); // 3. 移除数组/对象末尾的多余逗号(JSON不允许尾逗号) validJson = validJson.replace(/,\s*([}\]])/g, '$1'); // 4. 解析为JS对象 return JSON.parse(validJson); } // 测试 const result = customParser(input); console.log(result);
说明
- 键名处理:正则
\b([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:匹配合法的JS标识符(作为键名),替换为带双引号的键名。 - 字符串值处理:正则
:\s*([a-zA-Z][a-zA-Z0-9\s]*)(?=[,\}\]])匹配字母开头、由字母/数字/空格组成的字符串值,替换为带双引号的形式,同时通过正向断言确保后面是分隔符或闭合符号。 - 尾逗号处理:正则
,\s*([}\]])匹配数组/对象末尾的多余逗号,移除后符合JSON规范。
局限性
如果字符串值包含逗号、特殊字符(如引号、括号),或有更复杂的嵌套场景,上述正则可能失效。这种情况下需要实现简易的词法分析器,逐字符扫描并处理token,但对于大多数简单场景,上述方案足够使用。
内容的提问来源于stack exchange,提问作者Chaos3326
相关产品推荐
相关产品推荐

