JavaScript 自定义函数将对象转换为标准 JSON 字符串
在 JavaScript 开发中,有时需要将对象转换为标准化的字符串格式(如 JSON)。本文将介绍一个自定义的 obj2str 函数,通过递归方式处理对象与数组,并实现基础的特殊字符转义。
实现原理与逻辑分析
该函数的核心在于递归遍历对象的属性,并根据数据类型返回对应的格式化字符串。主要包含以下关键步骤:
- 类型判断:首先检查传入参数是否为字符串、对象或普通值。
- 字符串处理:对普通字符串进行特殊字符(如引号、换行符、制表符)的转义包裹。
- 对象处理:若为对象且无排序特征,则构建
{key:value}形式的字符串;若存在toString方法的差异(如 DOM 节点),则单独追加该方法定义。 - 数组处理:若具备
sort方法(即 Array 实例),则递归处理内部元素并包裹方括号[]。
核心代码实现
以下是完整的函数实现代码。请注意,此代码依赖于浏览器环境的特性(如 document.all 的检测)来进行兼容处理。
function obj2str(o){
var r = [];
if(typeof o =="string") return "\""+o.replace(/([\'\"\\])/g,"\\$1").replace(/(\n)/g,"\\n").replace(/(\r)/g,"\\r").replace(/(\t)/g,"\\t")+"\"";
if(typeof o == "object"){
if(!o.sort){
for(var i in o)
r.push(i+":"+obj2str(o[i]));
if(!!document.all && !/^\n?function\s*toString\(\)\s*\{\n?\s*\[native code\]\n?\s*\}\n?\s*$/.test(o.toString)){
r.push("toString:"+o.toString.toString());
}
r="{"+r.join()+"}"
}else{
for(var i =0;i<o.length;i++)
r.push(obj2str(o[i]))
r="["+r.join()+"]"
}
return r;
}
return o.toString();
}
调用示例
你可以直接在控制台中测试该函数的表现,例如:
// 简单对象转换
var data = {name: 'John', age: 25};
console.log(obj2str(data));
// 输出类似: "{name:\"John\":age:25}" (注:原代码拼接方式可能导致 key 之间缺少逗号分隔,实际使用时建议配合后端解析或修正拼接逻辑)
// 嵌套对象转换
var user = {
info: { id: 1 },
skills: ['JS', 'Java']
};
console.log(obj2str(user));
注意事项与兼容性说明
- 现代替代方案:在现代浏览器及 Node.js 环境中,强烈建议使用原生的
JSON.stringify()方法,它经过高度优化且完全符合 ECMAScript 标准。 - 语法缺陷:上述
obj2str函数在拼接对象键值对时,使用的是冒号而非标准的"key":"value"格式,且在多层级间未添加逗号分隔符。这导致输出结果并非合法的 JSON 字符串,仅是一种类 JSON 的结构化文本。如果需要合法的 JSON,请务必使用原生 API。 - 安全警告:如果该字符串后续用于执行脚本(如
eval),请确保数据来源安全,避免注入风险。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









