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

如何将含函数的JS对象转换为可JSON.parse解析的JSON编码字符串?

问题分析与解决方案

你的自定义convert函数无法生成可被JSON.parse解析的格式,核心问题在于不符合JSON规范的细节处理,以下是具体问题和修正方案:

原函数的核心问题

  1. 属性名未加双引号:JSON要求所有对象键必须是双引号包裹的字符串,原函数直接拼接键名,不符合规范。
  2. 函数字符串未转义引号:函数内的双引号会直接破坏JSON结构,导致解析失败。
  3. 末尾多余逗号:循环拼接时最后一个键值对会多出逗号,JSON不允许这种 trailing comma。
  4. 基础类型处理错误:直接给数字、布尔值加双引号会改变其类型,不符合JSON类型要求。

修正后的convert函数

function convert(obj) {
  // 优先处理数组
  if (Array.isArray(obj)) {
    return `[${obj.map(item => convert(item)).join(', ')}]`;
  }
  // 处理函数:转字符串后转义双引号,再包裹双引号
  if (typeof obj === 'function') {
    return `"${obj.toString().replace(/"/g, '\\"')}"`;
  }
  // 单独处理null(typeof null返回object)
  if (obj === null) {
    return 'null';
  }
  // 处理普通对象
  if (typeof obj === 'object') {
    const entries = Object.entries(obj).map(([key, value]) => {
      return `"${key}": ${convert(value)}`;
    });
    return `{${entries.join(', ')}}`;
  }
  // 基础类型用JSON.stringify自动处理类型和转义
  return JSON.stringify(obj);
}

使用示例

输入:

const input = {
  rules3: {
    fn1: ()=> {
      setTimeout(function abc() {console.log("aaaaaaaa")}, 3000);
    }
  }
}

生成可解析的JSON字符串:

const jsonStr = convert(input);
// 输出:"{"rules3":{"fn1":"()=> {\n      setTimeout(function abc() {console.log(\"aaaaaaaa\")}, 3000);\n    }"}}"
// 可直接用JSON.parse(jsonStr)解析

如果要生成你期望的带变量声明的格式:

const output = `const input = ${convert(input)}`;
console.log(output);

输出:

const input = {"rules3":{"fn1":"()=> {\n      setTimeout(function abc() {console.log(\"aaaaaaaa\")}, 3000);\n    }"}}

关键说明

  • 函数转义:通过replace(/"/g, '\\"')转义函数字符串内的所有双引号,避免破坏JSON结构。
  • 严格遵循JSON规范:所有对象键用双引号包裹,利用JSON.stringify处理基础类型,保证类型和格式正确。
  • 消除多余逗号:通过Object.entries遍历后拼接数组,避免循环末尾的无效逗号。

内容的提问来源于stack exchange,提问作者Aditya B Vijay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:55:32