JSON.stringify()

参考JSON.stringify()

此方法将一个js对象转为JSON字符串

参数:JSON.stringify(value[, replacer [, space]])

返回值 JSON字符串

value的各种情况及返回值

  1. 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值
JSON.stringify([new String('string'), new Number(12), new Boolean(true)])
// '["string",12,true]'
  1. undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。函数、undefined 被单独转换时,会返回 undefined。所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。
JSON.stringify([Symbol(""),function test(){return 12}, undefined,null, Object,NaN,Infinity])
// '[null,null,null,null,null,null,null]'
JSON.stringify(function test(){return 12}) // undefined
JSON.stringify(undefined) // undefined
JSON.stringify(Symbol("")) // undefined
JSON.stringify(Object) // undefined
JSON.stringify(null) // 'null'
JSON.stringify(NaN) // 'null'
JSON.stringify(Infinity) // 'null'
const test = {
  fn: function () {
    return 'ss'
  },
  sym: Symbol(''),
  un: undefined,
  nul: null,
  obj: Object,
  str: new String('str'),
  num: new Number(12),
  bool: new Boolean(true)
}
JSON.stringify(test) // '{"nul":null,"str":"str","num":12,"bool":true}'
  1. 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。
  2. Date 日期调用了 toJSON() 将其转换为了 string 字符串(同 Date.toISOString()),因此会被当做字符串处理。
JSON.stringify(new Date()) // '"2022-11-28T14:55:41.474Z"'
  1. 他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性。
const wrongMap = new Map();
wrongMap['bla'] = 'blaa';
wrongMap['bla2'] = 'blaaa2';
wrongMap.set('we',23)
JSON.stringify(wrongMap) 
// '{"bla":"blaa","bla2":"blaaa2"}'
  1. 不可枚举的属性默认会被忽略
JSON.stringify(
    Object.create(
        null,
        {
            x: { value: 'x', enumerable: false },
            y: { value: 'y', enumerable: true }
        }
    )
);
// "{"y":"y"}"
  1. 如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是该对象被序列化,而是调用 toJSON 方法后的返回值会被序列化
const parentObj = {
      name: 'parent',
      color: 'red',
      toJSON: function () {
        return 'bar';
      }
    };
console.log(JSON.stringify(parentObj, null, '\t'));// "bar"

replacer的各种情况

  1. 函数,如果返回一个指定的值(string.number,boolean)则会作为属性值添加进JSON字符串
const parentObj = {
  name: 'parent',
  color: 'red',
  num: 12,
  bool: true,
  fn: function () {},
  parent: 'parent'
};

function replacer(key, val) {
  if (['name'].includes(key)) {
    return undefined; // 如果为12则返回{"name":12,"color":"red","num":12,"bool":true,"parent":"parent"}
  }
  return val;
}
console.log(JSON.stringify(parentObj)); // {"name":"parent","color":"red","num":12,"bool":true,"parent":"parent"}
console.log(JSON.stringify(parentObj, replacer)); // {"color":"red","num":12,"bool":true,"parent":"parent"}
  1. 数组-如果 replacer 是一个数组,数组的值代表将被序列化成 JSON 字符串的属性名
console.log(JSON.stringify(parentObj, ['name'])); // {"name":"parent"}

space

  1. 为数字时,则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多 10 个空格),即设置超过10的数组,永远都是10个空格
const parentObj = {
  name: 'parent',
  color: 'red'
};
console.log(JSON.stringify(parentObj, null, 10));
console.log(JSON.stringify(parentObj, null, 900));

JSON.stringify()_第1张图片

  1. 如果是一个字符串,则每一级别会比上一级别多缩进该字符串(或该字符串的前 10 个字符)
console.log(JSON.stringify(parentObj, null, '1234567890a'));

JSON.stringify()_第2张图片

console.log(JSON.stringify(parentObj, null, '\t'));

JSON.stringify()_第3张图片

你可能感兴趣的:(json,前端,javascript)