将对象序列化为字符串及反序列化的实用方法
引言
需要将一个包含基本数据类型和复杂数据类型的对象转为字符串
需要处理的数据格式
数据格式包含:string,number,object,array,function,null,boolean
const obj = {
a: 1,
b: "string",
c: { size: 12, color: "red" },
d: () => { return "function result"; },
e: null,
f: false,
g: { person: { name: "Alice", hobbies: ["reading", "swimming"] } },
};
实现方式
- 序列化
因为JSON.stringify()方法无法序列化函数,所以需要自定义一个序列化函数,将函数转换为字符串,再转换为JSON对象。
function objectToString(obj) {
return JSON.stringify(obj, (key, value) => {
if (typeof value === "function") {
return "__FUNCTION__" + value.toString();
}
return value;
});
}
- 反序列化
判断是否有函数字符串,则使用eval()方法将函数字符串转换为函数。
function stringToObject(str) {
return JSON.parse(str, (key, value) => {
if (typeof value === "string") {
if (value.startsWith("__FUNCTION__")) {
const functionString = value.slice(12);
return eval("(" + functionString + ")");
}
}
return value;
});
}
- 使用
// 序列化
const customString = objectToString(obj);
console.log(customString);
// 反序列化
const parsedObj = stringToObject(customString);
console.log(parsedObj);
注意事项
- 序列化时,函数会被转换为字符串,并加上前缀"FUNCTION",以便在反序列化时还原为函数。
- 反序列化时,如果遇到函数字符串,则使用eval()方法将函数字符串转换为函数。