javascriptJSON.stringify()
JSON.stringify()方法能够将一个javascript值转换字符串。 JSON.stringify() - 图1

参数

  1. value

要转换为字符串的值。

  1. replacer:(可选)

可以为

  1. - 函数:则在转换过程中,被转换的值的每个属性都会经过该函数的转换和处理。
  2. - 数组:只有包含在这个数组中的属性名才会被转换到最终的 JSON 字符串。
  3. - `null`或未提供:对象所有的属性都会被序列化。
  1. space:(可选)

指定缩进用的空白字符串,用于美化输出。可以为

  1. - 数字:代表有多少的空格;上限为10。该值若小于1,则意味着没有空格。
  2. - 字符串:(当字符串长度超过10个字母,取其前10个字母),该字符串将被作为空格。
  3. - `null`或未提供:没有空格。


规则描述

  • 转换值如果有 toJSON() 方法,该方法定义什么值将被序列化。

    1. let obj = {
    2. foo: 'foo',
    3. toJSON: function () {
    4. return 'bar';
    5. }
    6. };
    7. JSON.stringify(obj);
    8. // '"bar"'
    9. JSON.stringify({x: obj});
    10. // '{"x":"bar"}'
  • 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中

  • 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。

    1. JSON.stringify([new Number(1), new String("false"), new Boolean(false)]);
    2. // '[1,"false",false]'
  • undefined任意的函数以及symbol值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。

  • 函数、undefined 被单独转换时,会返回 undefined,如JSON.stringify(function(){}) or JSON.stringify(undefined) ```javascript JSON.stringify({x: undefined, y: Object, z: Symbol(“”)}); // ‘{}’

//undefined单独转换 JSON.stringify(undefined) //undefined

//函数被单独转换 JSON.stringify(function(){}) //undefined

  1. - 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。
  2. - 所有以 `symbol` 为属性键的属性都会被完全忽略掉,即便 `replacer` 参数中强制指定包含了它们。
  3. ```javascript
  4. JSON.stringify({[Symbol("foo")]: "foo"});
  5. // '{}'
  • Date日期调用了toJSON()将其转换为了string 字符串(同Date.toISOString()),因此会被当做字符串处理。
  • NaNInfinity格式的数值及null都会被当做null

    1. JSON.stringify({ a: NaN, b : Infinity,c:null })
    2. //"{"a":null,"b":null,"c":null}"
  • 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性。

    1. JSON.stringify(
    2. Object.create(
    3. null,
    4. {
    5. x: { value: 'x', enumerable: false },
    6. y: { value: 'y', enumerable: true }
    7. }
    8. )
    9. );
    10. // "{"y":"y"}"

replacer参数

replacer参数可以是一个函数或者一个数组。

函数

接受两个参数,keyvalue
在开始时, replacer 函数会被传入一个空字符串作为 key 值,代表着要被 stringify 的这个对象。随后每个对象或数组上的属性会被依次传入。
函数应当返回JSON字符串中的value, 如下所示:

  • 如果返回一个 Number, 转换成相应的字符串作为属性值被添加入 JSON 字符串。
  • 如果返回一个 String, 该字符串作为属性值被添加入 JSON字符串。
  • 如果返回一个 Boolean, “true“ 或者 “false“ 作为属性值被添加入 JSON 字符串。
  • 如果返回任何其他对象,该对象递归地序列化JSON字符串,对每个属性调用 replacer 方法。除非该对象是一个函数,这种情况将不会被序列化成 JSON 字符串。
  • 如果返回 undefined,该属性值不会在 JSON 字符串中输出。

:::info replacer函数可以通过条件返回undefined 来使不需要转换的值不转换! :::

  1. //不序列化字符串类型的值
  2. function replacer(key, value) {
  3. if (typeof value === "string") {
  4. return undefined;
  5. }
  6. return value;
  7. }
  8. let foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
  9. let jsonString = JSON.stringify(foo, replacer);//{"week":45,"month":7}

数组

如果 replacer 是一个数组,数组的值代表将被序列化成 JSON 字符串的属性名。

  1. let foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
  2. JSON.stringify(foo, ['week', 'month']);
  3. // '{"week":45,"month":7}', 只保留 “week” 和 “month” 属性值。

space参数

用来控制结果字符串里面的间距。可以是数字也可以字符串。

  • 数字:在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格) ```javascript JSON.stringify({a:2},null,2) //“{ // “a”: 2 //}”

JSON.stringify({a:2},null,11) //“{ // “a”: 2 //}”

  1. - 字符串:每一级别会比上一级别多缩进该字符串(或该字符串的前10个字符)
  2. ```javascript
  3. JSON.stringify({a:2},null,'as')
  4. //"{
  5. //as"a": 2
  6. //}"
  7. JSON.stringify({a:2},null,'12345678901')
  8. //"{
  9. //1234567890"a": 2
  10. //}"

:::success JSON不是JavaScript严格意义上的子集 :::