JSON.parse和JSON.stringify方法

JSON.parse()

JSON.parse()方法将json字符串转化为Javascript值或对象。

语法

JSON.parse(text[,reviver])

参数

text:要被解析成Javascript值的字符串
reviver:若是一个函数则规定了原始值(text)如何被解析改造,在被返回前。

示例

JSON.parse('{}');              // {}
JSON.parse('true');            // true
JSON.parse('"foo"');           // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null');            // null

使用reviver函数(解析值本身以及它所包含的所有属性,会按照一定的顺序:从最最里层的属性开始一级级往外,最终到达顶层,也就是解析值本身分别的去调用reviver函数)

JSON.parse('{"p":5,"":100}',function(k,v){
          if(k === "") return v;
          return v*2;
})
返回:{p:10,"":100}


//从这个例子可以看出遍历是从内往外的。
JSON.parse('{"1":1,"2":2,"3":{"4":4,"5":{"6":6}}}',function(k,v){
          console.log(k); //输出当前的属性名,从而得知遍历顺序是从内向外的,最后一个属性名会是个空字符串。
          return v;  //返回原始属性值,相当于没有传递reviver参数。
})
返回:1 2 4 6 5 3 ""

JSON.stringify()

JSON.stringify() 方法将一个JavaScript值转换为一个JSON字符串,如果指定了一个replacer函数,则可以替换值,或者如果指定了一个replacer数组,可选的仅包括指定的属性.

语法

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

参数

value:将要序列化成 一个JSON字符串的值
replacer:如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化;
space:指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格。

描述

关于序列化,有下面五点注意事项:

1.非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
2.布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
3.undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。
4.所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。
5.不可枚举的属性会被忽略

JSON.stringify({});                        // '{}'
JSON.stringify(true);                      // 'true'
JSON.stringify("foo");                     // '"foo"'
JSON.stringify([1, "false", false]);       // '[1,"false",false]'
JSON.stringify({ x: 5 });                  // '{"x":5}'

JSON.stringify({x: 5, y: 6});              
// "{"x":5,"y":6}"

JSON.stringify([new Number(1), new String("false"), new Boolean(false)]); 
// '[1,"false",false]'

JSON.stringify({x: undefined, y: Object, z: Symbol("")}); 
// '{}'

JSON.stringify([undefined, Object, Symbol("")]);          
// '[null,null,null]' 

JSON.stringify({[Symbol("foo")]: "foo"});                 
// '{}'

JSON.stringify({[Symbol.for("foo")]: "foo"}, [Symbol.for("foo")]);
// '{}'

JSON.stringify(
    {[Symbol.for("foo")]: "foo"}, 
    function (k, v) {
        if (typeof k === "symbol"){
            return "a symbol";
        }
    }
);


// undefined 

// 不可枚举的属性默认会被忽略:
JSON.stringify( 
    Object.create(
        null, 
        { 
            x: { value: 'x', enumerable: false }, 
            y: { value: 'y', enumerable: true } 
        }
    )
);

// "{"y":"y"}"

replacer参数

function replacer(key,value){
      if(typeof value === "string"){
          return undefined;
    }
    return value;
}
var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
var jsonString = JSON.stringify(foo,replacer);
返回:{"week":45,"month":7};

//如果replacer是一个数组,数组的值代表将被序列化成JSON字符串的属性名
JSON.stringify(foo,["model","transport"]);
返回: '{"model":"box","transport":"car"}';



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yusirxiaer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值