Javascript:JSON.stringify()与toJSON()

发布时间 2023-07-11 11:21:08作者: MARSHBAN

JSON.stringify()

方法 JSON.stringify(student) 接收对象并将其转换为字符串。
例如,在这里我们 JSON.stringify 一个 student 对象:

let student = {
  name: 'John',
  age: 30,
  isAdmin: false,
  courses: ['html', 'css', 'js'],
  spouse: null
};

let json = JSON.stringify(student);

alert(typeof json); // we've got a string!

alert(json);
/* JSON 编码的对象:
{
  "name": "John",
  "age": 30,
  "isAdmin": false,
  "courses": ["html", "css", "js"],
  "spouse": null
}
*/

请注意,JSON 编码的对象与对象字面量有几个重要的区别:
字符串使用双引号。JSON 中没有单引号或反引号。所以 'John' 被转换为 "John"。
对象属性名称也是双引号的。这是强制性的。所以 age:30 被转换成 "age":30。

toJSON()

toJSON() 是 JavaScript 中的一个方法,用于自定义对象在被序列化为 JSON 字符串时的行为。它是对象的一个内置方法,当对象被传递给 JSON.stringify() 方法进行 JSON 序列化时,如果对象具有 toJSON() 方法,那么该方法将被调用。toJSON() 方法应该返回一个可序列化为 JSON 的值,可以是对象、数组、字符串、数字、布尔值或 null。

以下是一个使用 toJSON() 方法的示例:

const obj = {
  name: 'John',
  age: 30,
  toJSON() {
    return {
      name: this.name,
      age: this.age,
      customField: 'Some custom value'
    };
  }
};

const jsonString = JSON.stringify(obj);
console.log(jsonString);

输出结果为:

{"name":"John","age":30,"customField":"Some custom value"}

在上述示例中,obj 对象定义了一个 toJSON() 方法。当 JSON.stringify() 方法将 obj 对象转换为 JSON 字符串时,会调用 toJSON() 方法,并返回该方法的返回值作为序列化结果。

当调用 JSON.stringify() 方法时,如果要序列化的对象没有 toJSON() 方法,JSON.stringify() 方法将使用默认的序列化行为来处理对象。默认情况下,JSON.stringify() 方法会遍历对象的可枚举属性,并将它们转换为对应的 JSON 值。
以下是一个没有 toJSON() 方法的对象的示例:

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

const jsonString = JSON.stringify(obj);
console.log(jsonString);

输出结果为:

{"name":"John","age":30,"hobbies":["reading","coding"]}