序列化:JSON.stringify用法
JSON.stringify()用来将value(string、object、array、number、boole、null等)序列化为json字符串,一般情况下,我们用如下方式来使用:
1 var dataJson={ 2 name:"ESStudio", 3 info:{ 4 content:"描述", 5 email:"ESStudio@ESStudio.org" 6 }, 7 version:"1.0.1", 8 hits:10002, 9 publishedData:"2018年12月21日15:15:05" 10 } 11 12 //序列化 13 JSON.stringify(dataJson);
输出结果为: {"name":"ESStudio","info":{"content":"描述","email":"ESStudio@ESStudio.org"},"version":"1.0.1","hits":10002,"publishedData":"2018年12月21日15:15:05"}
如果想将json字符串转为json对象,使用JSON.parse(jsonStr);即可。
其实,JSON.stringify()函数的定义为JSON.stringify(value[, replacer [, space]])。其有三个参数:
- value:{type : String|Object|String|Number|Boolean|null} {explain : 传入的类型可以是列出的这些;
- replacer:{type : []|{}} {注意 : 过滤器可以是个数组,也可以是个函数};
- space:{type : Number | 特殊符号} {注意 : 如果是数字则代表空白符的个数,最多10个;也可以直接传入缩进的符号,如”\t“一个制表符}
下面接合例子进行两位两个参数应用:
还用上面的dataJson进行举例,现在使用第二个参数,用一个函数进行处理,代码为:
1 var dataJson={ 2 name:"ESStudio", 3 info:{ 4 content:"描述", 5 email:"ESStudio@ESStudio.org" 6 }, 7 version:"1.0.1", 8 hits:10002, 9 publishedData:"2018年12月21日15:15:05" 10 } 11 12 //序列化 13 JSON.stringify(dataJson,function(key,val){ 14 switch(key){ 15 case 'name': 16 return val+'@2018'; 17 default: 18 return val; 19 } 20 });
运行结果为: "{"name":"ESStudio@2018","info":{"content":"描述","email":"ESStudio@ESStudio.org"},"version":"1.0.1","hits":10002,"publishedData":"2018年12月21日15:15:05"}" ,此处发现name节点的值补充了过滤器中处理的结果。
接着,我们如果针对dataJson只需要其中的name与hits节点,则我们可以将第二个参数传入我们需要的节点的数组即可,代码为:
1 var dataJson={ 2 name:"ESStudio", 3 info:{ 4 content:"描述", 5 email:"ESStudio@ESStudio.org" 6 }, 7 version:"1.0.1", 8 hits:10002, 9 publishedData:"2018年12月21日15:15:05" 10 } 11 12 //序列化 13 JSON.stringify(dataJson,["name","hits"]);
运行结果为: "{"name":"ESStudio","hits":10002}"
继续,验证第三个参数使用。
测试代码为:
1 var dataJson={ 2 name:"ESStudio", 3 info:{ 4 content:"描述", 5 email:"ESStudio@ESStudio.org" 6 }, 7 version:"1.0.1", 8 hits:10002, 9 publishedData:"2018年12月21日15:15:05" 10 } 11 12 //序列化 13 JSON.stringify(dataJson,null,'\t');
”\t“即我们用一个制表符来格式化每个节点,运行结果如下:
"{ "name": "ESStudio", "info": { "content": "描述", "email": "ESStudio@ESStudio.org" }, "version": "1.0.1", "hits": 10002, "publishedData": "2018年12月21日15:15:05" }"
注意:
- 如果dataJson对象中出现诸如节点为undefined、任意的函数、symbol值等,在序列化过程中会被忽略(出现在非数组对象的属性值中)或被转换为null(出现在数组对象的属性值中)。
- 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
- 所有以 symbol 为属性键的属性都会被完全忽略掉,即便replacer中强制包含了它们。
- 不可枚举的属性会被忽略,如如下代码
1 JSON.stringify( Object.create(null, { x: { value: 'x', enumerable: false }, y: { value: 'y', enumerable: true } }) ); 2 // '{"y":"y"}'