zoukankan      html  css  js  c++  java
  • JSON.stringify的三个参数(转载)

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

    参考资料:

    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里的数据类型有一些要求:

    • 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
    • 就是不能保证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"}'

    两个参数

    第二个参数很有意思,可以为一个过滤函数,也可以是一个数组。

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

    过滤函数

    过滤函数还是比较有意思的,你可以控制输出,比如之前提到的会被忽略的类型,可以在这里人工的处理,强制输出(当然是别的类型)。

     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的话,后面的遍历就没法玩下去了。

    数组

    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,'	');
    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,如果是别的类型就不行了,比如之前提到的数组。

  • 相关阅读:
    ZCMU训练赛-H(模拟)
    ZCMU训练赛-B(dp/暴力)
    ZCMU训练赛-A(模拟)
    HDU 2045 LELE的RPG难题(递推)
    HDU 2044 一只小蜜蜂(递归)
    HDU 2050 折线分割平面(转)
    对递归的理解归纳(转)
    漫谈递归思想(转)
    2017中南大学暑期集训day1 : debug&STL-A
    探寻宝藏--河南省第六届大学生程序设计竞赛
  • 原文地址:https://www.cnblogs.com/JQstronger/p/9052435.html
Copyright © 2011-2022 走看看