JSON.stringify的三个参数(转载)

前段时间勾股有提到stringify是支持三个参数,刷新的了个人认知,后来查到文档才发现还真的是支持三个参数的。javascript

参考资料:java

stringify方法顾名思义,就是把JSON序列换,其语法以下:数组

JSON.stringify(value[, replacer [, space]])

注意到它接收三个参数,后面2个参数是可选的。函数

只传一个参数

1 var data = {name:"niuzai",info:{age:18,sex:"male"}}; 2 
3 JSON.stringify(data); //{"name":"niuzai","info":{"age":18,"sex":"male"}}

这里要注意:stringily对data里的数据类型有一些要求:spa

  • 非数组对象的属性不能保证以特定的顺序出如今序列化后的字符串中。
  • 就是不能保证hash结构的顺序是按照定义输出
1 JSON.stringify({x: 5, y: 6}); 2 // '{"x":5,"y":6}' 或者 '{"y":6,"x":5}' 均可能
  • 布尔值、数字、字符串的包装对象在序列化过程当中会自动转换成对应的原始值。
  • undefined、任意的函数以及 symbol 值,在序列化过程当中会被忽略(出如今非数组对象的属性值中时)或者被转换成 null(出如今数组中时)。
1 var obj = {"undefined":undefined,"func":function(){},"symbol":Symbol("")}; 2 JSON.stringify(data); //"{}"
3 
4 var arr = [undefined,Symbol(""),function(){}]; 5 JSON.stringify(arr); //[null,null,null]
  • 全部以 symbol 为属性键的属性都会被彻底忽略掉,即使 replacer 参数中强制指定包含了它们。
JSON.stringify({[Symbol("foo")]: "foo"});   //'{}'
  •  不可枚举的属性会被忽略
1 JSON.stringify( Object.create(null, { x: { value: 'x', enumerable: false }, y:{value: 'y', enumerable: true } }) ); 2 // '{"y":"y"}'

两个参数

第二个参数颇有意思,能够为一个过滤函数,也能够是一个数组。code

当为数组时被序列化的值的每一个属性都会通过该函数的转换和处理,当为数组时则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中。对象

过滤函数

过滤函数仍是比较有意思的,你能够控制输出,好比以前提到的会被忽略的类型,能够在这里人工的处理,强制输出(固然是别的类型)。blog

 1 var data = {  2   name:"niuzai",  3  info:{  4     age:18,  5     sex:"male"
 6  }  7 };  8 
 9 JSON.stringify(data, function(key, val){ 10   console.log("key is %s", key); 11   console.log("val is %s", typeof(val)); 12   return val; 13 }); 14 //key is
15 //key is 
16 //val is object
17 //key is name
18 //val is string
19 //key is info
20 //val is object
21 //key is age
22 //val is number
23 //key is sex
24 //val is string
25 "{"name":"niuzai","info":{"age":18,"sex":"male"}}"

注意:这里必定要return一个值给下一个遍历函数做为参数传入,若是不return的话,后面的遍历就无法玩下去了。ip

数组

1 JSON.stringify(data, ["name", "info", "sex"]); 2 
3 //age因为不在列表里,因此没被序列化
4 //"{"name":"niuzai","info":{"sex":"male"}}"

三个参数

第三参数space用来控制结果字符串里面的间距。若是是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);若是是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符)。文档

 1 JSON.stringify(data,null,10);  2 //每个层级比上一个多10个空格
 3 "{  4           "name": "niuzai",  5           "info": {  6                     "age": 18,  7                     "sex": "male"
 8  }  9 }"
10 
11 JSON.stringify(data,null,'\t'); 12 //每个层级比上一个多一个制表符
13 "{ 14   "name": "niuzai", 15   "info": { 16     "age": 18, 17     "sex": "male"
18  } 19 }"

toJSON 方法

若是一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为

 1 var data = {  2   name:"niuzai",  3  info:{  4     age:18,  5     sex:"male"
 6  },  7   toJSON:function(){  8     return "by toJSON";  9  } 10 }; 11 
12 JSON.stringify(data); 13 //""by toJSON"";

注意:这里的toJSON必须是一个function,若是是别的类型就不行了,好比以前提到的数组。

相关文章
相关标签/搜索