JSON.parse是将一个JSON格式的字符串转换成js对象(JSON对象)。
首先来简单说下JSON字符串,在前后端进行数据传输过程中,JSON是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以需要将其进行转换。那么JSON格式是什么呢?
JSON格式就是表示一系列的“值”的方法,这些值包含在数组或对象之中,是它们的成员。
对于这一系列的“值”,有如下几点格式规定:
-
数组或对象的每个成员的值,可以是简单值,也可以是复合值。
-
简单值分为四种:字符串、数值(必须以十进制表示)、布尔值和null,(NaN,Infinity,-Infinity和undefined都会被转为null)。
-
复合值分为两种:符合JSON格式的对象和符合JSON格式的数组。
-
数组或对象最后一个成员的后面,不能加逗号。
-
数组或对象之中的字符串必须使用双引号,不能使用单引号。
-
对象的成员名称必须使用双引号。
eg:
合格的JSON:
{
"name":"Tom",
"age":18,
"hobby":["music","play"]
}
[{"animal":"dog"},{"animal":"cat"}]
不合格的JSON
{"name":"Lucky",'age':32 } // 属性名必须使用双引号
[32, 64, 128, 0xFFF] // 不能使用十六进制值
{"name":"Lucky",age:undefined } // 不能使用undefined
{
"name": "Lucky",
"birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
"getName": function() {
return this.name;
}
} // 不能使用函数和日期对象
注意:空数组和空对象都是合格的JSON值,null本身也是一个合格的JSON值。
1.方法的定义
JSON.parse(text[,reviver])
参数一:需要解析成JavaScript值的字符串
参数二:可选参数,用来修改解析生成的值,该参数调用在解析函数返回之前。
返回值:Object
eg:
JSON.parse('{}'); // {}
JSON.parse('true'); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null'); // null
JSON.parse('1'); // 1
// 若传入的字符串不符合JSON规范,会抛出 SyntaxError 异常
//JSON.parse("'String'") // Uncaught SyntaxError: Unexpected token ... in JSON
// 处理解析错误,可以将JSON.parse方法放在try...catch代码块中。
try{
JSON.parse("'String'")
}catch(err){
console.log(err)
}
//传入第二个参数
function f(key, value) {
if ( key === ""){
return value;
}
if ( key === "a" ) {
return value + 10;
}
}
var o = JSON.parse('{"a":1,"b":2,"":23}', f);
o // {a: 11, "": 23}
o.a // 11
o.b // undefined
2.除了JSON.parse外,JavaScript中还有两种常用的方法用于字符串转JSON对象。
1)使用eval()
// 为什么eval()解析的时候要加括号?
// 那是因为eval()相当于一个执行环境,当你不加括号的时候,str 会被认为是一条复合语句。
// 运行的时候就会逐个字符的解析,当加上括号的时,str 就当做一个表达式去运算。
// 从括号开始就被当做了对象进行识别。
var str = '{"name":"zhangsan","age":18,"gender":"man"}';
eval('('+str+')'); // 格式: eval( '(' + string + ')' );
// eval在解析字符串时,会执行该字符串中的代码。
// 这样的做法是危险的,一般不建议用eval解析
var num = 1;
var jsonstr = '{"name":"zhangsan","age":++num}';
var jsondata1 = eval('('+jsonstr+')');
console.log(jsondata1);
console.log(num);//这时num值为2
var jasondata2=JSON.parse(jsonstr);
console.log(jsondata2);//报错
2)使用new Function
function toJson(str){
var json = (new Function("return " + str))();
return json;
}
// IE6/7中当字符串中含有换行(\n)时,new Function不能解析,但eval却可以。