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"}';