在JavaScript中,对象序列化是指将一个JavaScript对象转换为字符串的过程,以便于存储(例如保存到文件或数据库)或传输(例如通过网络发送)。反序列化则是将这个字符串再转换回JavaScript对象的过程。
序列化:将数据结构或对象状态转换成字符串或二进制流的过程。 反序列化:将字符串或二进制流恢复成原始数据结构或对象状态的过程。
JSON.stringify()
方法将对象转换为JSON字符串,使用JSON.parse()
方法将JSON字符串转换回对象。structuredClone()
方法(现代浏览器支持)进行深拷贝,或者使用第三方库如protobuf
。localStorage
或sessionStorage
保存用户数据。// 序列化
const obj = { name: "Alice", age: 25 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出: '{"name":"Alice","age":25}'
// 反序列化
const parsedObj = JSON.parse(jsonString);
console.log(parsedObj); // 输出: { name: 'Alice', age: 25 }
const obj = { name: "Alice", age: 25, hobbies: ["reading", "swimming"] };
const clonedObj = structuredClone(obj);
console.log(clonedObj); // 输出: { name: 'Alice', age: 25, hobbies: ['reading', 'swimming'] }
JSON.stringify()
会抛出错误。circular-json
或自定义序列化函数处理循环引用。const CircularJSON = require('circular-json');
const obj = { name: "Alice" };
obj.self = obj;
const jsonString = CircularJSON.stringify(obj);
console.log(jsonString); // 输出: {"name":"Alice","self":"~"}
const parsedObj = CircularJSON.parse(jsonString);
console.log(parsedObj); // 输出: { name: 'Alice', self: [Circular] }
JSON.stringify()
会忽略对象中的函数和Symbol属性。function serialize(obj) {
return JSON.stringify(obj, (key, value) => {
if (typeof value === 'function') {
return { __type: 'function', value: value.toString() };
}
return value;
});
}
function deserialize(jsonString) {
return JSON.parse(jsonString, (key, value) => {
if (value && value.__type === 'function') {
return new Function('return ' + value.value)();
}
return value;
});
}
const obj = { name: "Alice", greet: function() { console.log("Hello"); } };
const jsonString = serialize(obj);
const parsedObj = deserialize(jsonString);
parsedObj.greet(); // 输出: Hello
通过以上方法,可以有效解决JavaScript对象序列化过程中常见的问题。
领取专属 10元无门槛券
手把手带您无忧上云