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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:51:29