JSON.stringfiy 序列化
JSON.stringify () 方法是将一个javascript值(对象或数组)转换为一个JSON字符串,如果指定replacer是函数,则可以选择性的替换值,或者如果指定replacer是一个数组,可选择性的仅包含数组指定的属性
语法:
JSON.stringify(value [ , replacer [,space]])
Value : 将要序列化成一个JSON字符串的值
Replacer (可选) : 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的JSON字符串中;如果该参数为null 或者未提供,则对象的属性都会被序列化;
Space (可选):指缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少个空格,上线10,该值小于1,这意味没有空格;如果该参数为字符串(字符串的前十个字母),该字符串作为空格;如果没有提供(或者为null)将不提供空格
描述:
JSON.stringify()将值装换为相应的JSON格式
- 装换值日光有toJSON() 方法,该方法定义什么值将被序列化
- 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中
- 布尔值、数字、字符串的包装对象在序列化过程中会被转化成相应的原始对象
- Undefined、任意的函数symbol值,在序列化过程中会被忽略(出现在非数组对象中的属性值中)或者被转换成null(出现在数组中时)。函数、undefined被单独装换时,会返回undefined,如JSON.stringify(function(){}) or JSON.stringify(undefined)
- 对包含循环引用对象(对象之间相互引用,形成无线循环)执行此方法,会抛出错误
- 所有以Symbol为属性键的属性都会被完全忽略掉,即便replacer参数中强制指定包含它们
- Date日期调用toJSON()将其转化成string字符串(同Date.tolSoString()),因此会被当做字符串处理
- NaN和Infinity 格式的数值及null 都会被当作null
- 其他类型对象,包括Map/Set/WeakMap/WeakSet,仅会序列化可枚举属性
1 // JSON.stringify() 2 // let a=JSON.stringify({}); //{} 3 // let a=JSON.stringify(true); //true 4 // let a =JSON.stringify('foo'); //'foo' 5 // let a= JSON.stringify([1,'foo',false]); //[1,'foo',false] 6 // let a=JSON.stringify({x:5}); //{"x":5} 7 8 // let a=JSON.stringify([new Number(1),new String('false'),new Boolean(false)]); //[1,"false",false] 9 10 11 // let a=JSON.stringify( 12 // Object.create( 13 // null, 14 // { 15 // x:{value:'x',enumerable:false}, 16 // y:{value:'y',enumerable:true}, 17 // 18 // } 19 // ) 20 // ); //{"y":"y"}
2、replacer 参数
Replacer参数可以是一个函数或者数组。作为函数,它有两个参数,键(key)值(value)都会被序列化
(1) 、如果返回一个Number,转化成相应的字符串添加JSON字符串
(2) 返回一个String,该字符串作为属性值添加都JSON中
(3) 返回一个Boolean “true” 或者 “false” 会被当做属性属性被添加到JSON字符串中
(4) 如果返回人格其他对象,该对象递归的序列化成JSON字符串,对每个属性调用replacer方法,除非该对象是一个函数,这种情况下不会在JSON字符串中输出
(5) 如果返回undefined,该属性不会在JSON中输出
NOTE:不能用repacer方法,从数组中移除值(values),如果返回undefined或者一个函数,将会被null取代
(function)
1 function replacer(key,value){ 2 if(typeof value==='string'){ 3 return undefined; 4 } 5 return value; 6 } 7 8 var foo= {foundAtion:'Mozilla',model:'box',week:45}; 9 10 var jsonString=JSON.stringify(foo,replacer); 11 console.log(jsonString); //{"week":45}
(array)
如果replacer是一个数组,数组的值代表将序列化成JSON字符串的属性名
1 var foo= {foundAtion:'Mozilla',model:'box',week:45}; 2 console.log(JSON.stringify(foo,['model','week'])); //{"model":"box","week":45}
3、space参数
Space参数用来控制结果字符串里间距,如果是一个数字,则在字符串化时每一级会比上一级缩进多个数字值空格(最多10个);如果是一个字符串,则每一级都比上一级别多缩进该字符串
1 console.log(JSON.stringify({a:2,b:4},null," ")); 2 // { 3 // "a": 2, 4 // "b": 4 5 // } 6 7
toJSON方法
如果一个序列化对象拥有toJSON方法,那么toJSON方法就会覆盖该对象默认序列化行为,不是而不是那个对象序列化,而调用toJSON方法返回值会被序列化
1 var obj ={ 2 foo:'foo', 3 toJSON(){ 4 return 'bar' 5 } 6 }; 7 console.log(JSON.stringify(obj)); //"bar" 8 console.log(JSON.stringify({x:obj})) //{"x":"bar"}