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

JSON.parse无法解析含函数与DOM对象的字符串,如何转为JS对象?

嘿,这个问题我太熟了!你遇到的情况很典型——JSON.parse()根本处理不了这种包含函数、未引号属性名和DOM引用的字符串,毕竟JSON的规范里根本不允许这些“非标准”内容。下面给你几个可行的解决办法,按需选择就行:

方法1:直接用eval()(简单但要注意安全)

你的字符串本身就是合法的JavaScript对象字面量,直接用eval()包裹就能转成对象。代码示例:

const str = "{aa:function(){},bb:document.body}";
const obj = eval(`(${str})`);

// 测试验证
obj.aa(); // 能正常执行空函数
console.log(obj.bb); // 会输出当前页面的document.body元素

⚠️ 重要提醒:如果这个字符串是来自用户输入、第三方接口这类不可信来源,绝对不要用eval()!它会执行任何嵌入的JavaScript代码,存在极高的安全风险。

方法2:用Function构造函数(比eval稍安全一点)

原理是创建一个返回目标对象的匿名函数,再执行它获取结果。代码示例:

const str = "{aa:function(){},bb:document.body}";
const obj = new Function(`return ${str}`)();

// 同样可以正常使用
console.log(obj.bb);
obj.aa();

这个方式比eval()稍安全,因为它是在独立的函数作用域内执行,但如果字符串不可信,依然存在安全隐患,谨慎使用。

方法3:自定义解析器(最安全,适合严格场景)

如果字符串格式固定,你可以自己写解析逻辑,先把非JSON标准的内容转换成JSON能识别的格式,解析后再恢复原样。示例代码:

function parseCustomObject(str) {
  // 第一步:给未加引号的属性名补上双引号
  str = str.replace(/([a-zA-Z_$][a-zA-Z0-9_$]*)(?=:)/g, '"$1"');
  
  // 第二步:提取并标记函数,避免JSON.parse报错
  const funcMap = [];
  str = str.replace(/function\s*\([^)]*\)\s*{[^}]*}/g, (match) => {
    const key = `__FUNC_${funcMap.length}__`;
    funcMap.push(match);
    return `"${key}"`;
  });
  
  // 第三步:用JSON.parse解析处理后的字符串
  let obj = JSON.parse(str);
  
  // 第四步:恢复标记的函数
  for (const key in obj) {
    if (obj[key].startsWith('__FUNC_')) {
      const idx = parseInt(obj[key].slice(7, -2));
      obj[key] = new Function(`return ${funcMap[idx]}`)();
    }
  }
  
  // 第五步:恢复DOM引用(这里仅处理document.body,可按需扩展)
  for (const key in obj) {
    if (obj[key] === 'document.body') {
      obj[key] = document.body;
    }
  }
  
  return obj;
}

// 使用示例
const str = "{aa:function(){},bb:document.body}";
const obj = parseCustomObject(str);
console.log(obj.bb); // 输出document.body
obj.aa(); // 正常执行函数

这个方法的优势是完全可控,能避免执行恶意代码,但缺点是需要根据你的具体字符串格式调整解析逻辑,复杂场景下可能需要更完善的处理。

总结

  • 如果字符串是自己可控的(比如自己生成的),用eval()或Function最方便;
  • 如果字符串来自不可信来源,一定要用自定义解析,或者尽量避免使用这种非标准格式,改用“标准JSON+单独注册函数/引用”的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:35:54