📜  javascript中的序列化和反序列化(1)

📅  最后修改于: 2023-12-03 14:42:40.524000             🧑  作者: Mango

JavaScript中的序列化和反序列化

在 JavaScript 开发中,我们经常需要将对象或数据序列化后传输或存储,同时还需要从序列化的数据中还原出原始数据或对象。这种过程就是序列化和反序列化。本文将会介绍 JavaScript 中的序列化和反序列化的基本原理,以及常用的序列化方法和对象的反序列化方法。

什么是序列化?

序列化是指将对象或数据转换成字符串的过程。序列化过程通常是为了将对象或数据存储到持久化存储器(如磁盘)中,或者在网络上传输数据。

例如,我们可以使用以下方式将一个对象序列化为字符串:

const obj = {
  name: 'John',
  age: 30,
  isStudent: true,
  hobbies: ['reading', 'swimming']
};
const serializedStr = JSON.stringify(obj);
console.log(serializedStr); // 输出: {"name":"John","age":30,"isStudent":true,"hobbies":["reading","swimming"]}
什么是反序列化?

反序列化是指将序列化后的字符串还原为对象或数据的过程。主要用于从持久化存储器或网络中获取数据,并转换为原始的 JavaScript 对象或数据。

例如,我们可以使用以下方式将一个字符串反序列化为对象:

const serializedStr = '{"name":"John","age":30,"isStudent":true,"hobbies":["reading","swimming"]}';
const obj = JSON.parse(serializedStr);
console.log(obj); // 输出: {name: "John", age: 30, isStudent: true, hobbies: Array(2)}
JSON序列化和反序列化方法

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由 JavaScript 对象表示。JSON 存在于一个字符串中。在 JavaScript 中,使用 JSON 对象可以完成序列化和反序列化操作。

使用 JSON 对象中的 stringify() 方法可以将对象或其他数据类型转换成 JSON 字符串:

const obj = {
  name: 'John',
  age: 30,
  isStudent: true,
  hobbies: ['reading', 'swimming']
};
const serializedStr = JSON.stringify(obj);
console.log(serializedStr); // 输出: {"name":"John","age":30,"isStudent":true,"hobbies":["reading","swimming"]}

使用 JSON 对象中的 parse() 方法可以将 JSON 字符串转换成 JavaScript 对象:

const serializedStr = '{"name":"John","age":30,"isStudent":true,"hobbies":["reading","swimming"]}';
const obj = JSON.parse(serializedStr);
console.log(obj); // 输出: {name: "John", age: 30, isStudent: true, hobbies: Array(2)}

需要注意的是,JSON 字符串中的属性名必须使用双引号,否则解析会失败。

自定义序列化和反序列化方法

在某些情况下,我们需要对特定的对象进行自定义序列化和反序列化操作。JavaScript 提供了 toLocaleString()、toString() 和 valueOf() 等方法,这些方法在推断值类型时被内部方法自动调用。

我们可以通过在对象上定义 toJSON() 方法,来实现自己的序列化和反序列化逻辑。这个 toJSON() 方法会在 JSON.stringify() 中被自动调用。

例如:

const obj = {
  name: 'John',
  age: 30,
  isStudent: true,
  hobbies: ['reading', 'swimming']
};

obj.toJSON = function() {
  const cloneObj = Object.assign({}, this);
  delete cloneObj.hobbies;
  return cloneObj;
};

const serializedStr = JSON.stringify(obj);
console.log(serializedStr); // 输出: {"name":"John","age":30,"isStudent":true}

在反序列化时,我们可以传递一个 reviver() 函数作为 JSON.parse() 的第二个参数,来自定义解析逻辑。该函数会接收两个参数:属性名和属性值,并返回属性值。

例如:

const serializedStr = '{"name":"John","age":30,"isStudent":true,"hobbies":["reading","swimming"]}';
const obj = JSON.parse(serializedStr, (key, value) => {
  if (key === 'isStudent') {
    return !value;
  }
  return value;
});
console.log(obj); // 输出: {name: "John", age: 30, isStudent: false, hobbies: Array(2)}
结论

序列化和反序列化是前端开发中常用的技术,对于大部分情况下常规的序列化和反序列化工作,我们可以使用 JavaScript 中的 JSON 对象来完成。对于特殊情况下的自定义序列化和反序列化操作,我们可以通过在对象上定义 toJSON() 方法来实现。