1.JSON.parse()
先看如下:
image.png
可以得出:如果我们想要直接用
JSON.parse()
把字符串转成object,字符串的格式必须是:
'{"name":"张三","age":18}'//key值必须要用双引号包着,value如果是数字则不用
再看下图:
image.png
若里面有引号包着的内容,必须要这样转义。
如果碰到上面格式,想转成object,可以用eval()
eval("("+str+")");
看下图:
image.png
不管是单引号包着双引号,还是双引号包着单引号,不管key值有没有用引号包着都是OK的。
注意这里面的括号是非常重要的:
image.png
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
var obj = {a:1};
var obj1 = eval("( {a:1} )");
eval("var obj2 = {a:1}");
//这三个obj是一样的
除了使用eval()方法以外,还可以使用如下函数,也是都OK的
function toJSON(str){
return ( new Function ("return"+str) )();
}
注意:在代码中使用eval是很危险的,特别是用它执行第三方的JSON数据(其中可能包含恶意代码)时,比如'{"name":window.location.href="aaa"}'就会直接跳转到aaa去了。所以建议尽可能使用JSON.parse()方法解析字符串本身(虽然对数据要求严格,但是他安全)。
另外,JSON.parse()里面可以跟两个参数,第一个参数是一个JSON字符串必填,第二个是一个函数,可选,(一个转换结果的函数, 将为对象的每个成员调用此函数。)如:
image.png
从上可看出,最后一个k为"",这点需要注意下。
JSON.parse('{"1": 11, "2": 22}', function(k, v) {
if(k!==''){
console.log('k:'+k);
console.log('v:'+v);
}
});
2.JSON.stringify()
常用的就不说了,下面说说它的另外两个参数:
第二个参数若为数组。
var json={
a:"qq",
b:2,
c:"vv"
}
console.log(JSON.stringify(json,["a","b"]));
// {"a":"qq","b":2}//过滤掉 键名不为 a或者b 的key
第二个参数若为函数
var arr=[
{"name":"a","age":10,"sex":0},
{"name":"b","age":11,"sex":1},
{"name":"c","age":12,"sex":2}
]
var str1=JSON.stringify(arr, function(key, value){
if(key != 'age') return value;
});
console.log(str1);//过滤掉age
//[{"name":"a","sex":0},{"name":"b","sex":1},{"name":"c","sex":2}]
var arr=[
{"name":"a","age":10,"sex":0},
{"name":"b","age":11,"sex":1},
{"name":"c","age":12,"sex":2}
]
var str2=JSON.stringify(arr, function(key, value){
if(key == 'sex') return ["男","女"][value]?["男","女"][value]:value;
else return value;
});
console.log(str2);//用男女替换性别01
// [{"name":"a","age":10,"sex":"男"},{"name":"b","age":11,"sex":"女"},{"name":"c","age":12,"sex":2}]
第三个参数(实际用处暂时不知道)
var json={
a:"qq",
b:2,
c:"vv"
}
console.log(JSON.stringify(json));
console.log(JSON.stringify(json, null, 10));
console.log(JSON.stringify(json, null, 'hello'));
//数字表示缩进量(最多10个空格,大于10也只缩进10个),字符则表示填充字符
结果如下:
image.png