如何将含函数的JS对象转换为可JSON.parse解析的JSON编码字符串?
问题分析与解决方案
你的自定义convert函数无法生成可被JSON.parse解析的格式,核心问题在于不符合JSON规范的细节处理,以下是具体问题和修正方案:
原函数的核心问题
- 属性名未加双引号:JSON要求所有对象键必须是双引号包裹的字符串,原函数直接拼接键名,不符合规范。
- 函数字符串未转义引号:函数内的双引号会直接破坏JSON结构,导致解析失败。
- 末尾多余逗号:循环拼接时最后一个键值对会多出逗号,JSON不允许这种 trailing comma。
- 基础类型处理错误:直接给数字、布尔值加双引号会改变其类型,不符合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
相关产品推荐
相关产品推荐

