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

如何将无引号键值的字符串转换为可被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);
}

正则逻辑说明

  1. 匹配键名的正则:/([a-zA-Z0-9_]+):/g

    • 专门匹配由字母、数字、下划线组成的键名(比如foo、key),后面紧跟冒号的结构
    • 替换成"$1":,把键名用双引号包裹,符合JSON键的要求
  2. 匹配值的正则:/:([^,}]+)([,}])/g

    • 匹配冒号之后、逗号或大括号之前的内容(也就是每个键对应的值)
    • 通过回调函数判断值的类型:如果是有效数字就保持原样,否则给值加上双引号,避免把数值错误转成字符串

额外注意点

  • 如果你的值里包含空格、-、@这类特殊字符,可以把正则里的[^,}]+改成[^,}]*,能匹配更多字符
  • 如果字符串里有嵌套对象/数组,这个简单正则可能处理不了,这时候可以考虑用json5这类支持非标准JSON的库(不过如果不想引入第三方依赖,就得写更复杂的正则或者手动处理嵌套逻辑)

内容的提问来源于stack exchange,提问作者fooo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:50:08