JSON.parse方法用于将JSON字符串转化成对象。例如:
JSON.parse('{}') // {} JSON.parse('true') // true JSON.parse('"foo"') // "foo" JSON.parse('[1, 5, "false"]') // [1, 5, "false"] JSON.parse('null') // null var o = JSON.parse('{"name": "张三"}'); o.name // 张三
如果传入的字符串不是有效的JSON格式,JSON.parse方法将报错。
JSON.parse("'String'") // illegal single quotes // SyntaxError: Unexpected token ILLEGAL
在上面代码中,双引号字符串中是一个单引号字符串,因为单引号字符串不符合JSON格式,所以报错。
为了处理解析错误,可以将JSON.parse方法放在try/ catch代码块中。
JSON.parse()用法如下。
JSON.parse(text [, reviver])
参数text表示一个有效的JSON 字符串,最后返回一个对象或数组。
【提示】
JSON字符串的格式一定要标准,key和value一定要用双引号包括,否则会出现解析异常。
【示例1】下面代码使用JSON.parse将JSON字符串转换成对象。
var jsontext = '{"name":"张三","qq":"111111111","phone":["010-66666666","010-88888888"]}'; var contact = JSON.parse(jsontext); document.write(contact.name + ", " + contact.qq);// 输出:张三, 111111111
reviver为可选参数,它表示一个转换函数,JSON.parse()将为对象的每个成员调用该参数函数。如果成员包含嵌套对象,则先于父对象转换嵌套对象。对于每个成员,会发生以下情况:
- 如果reviver函数返回一个有效值,则成员值将替换为转换后的值。
- 如果reviver函数返回它接收的相同值,则不修改成员值。
- 如果reviver函数返回null或undefined,则删除成员。
【示例2】可选参数reviver是一个带有key和value两个参数的函数,其作用于结果,让过滤和转换返回值成为可能。例如,下面示例将把字符串'{"a": "1.5", "b": "2.3"}';转换为对象,然后通过int()函数对转换的对象成员值进行处理,确保每个值都为整数。
var n = '{"a": "1.5", "b": "2.3"}'; var result = JSON.parse(n,int ); document.write(result.a); //输出1 function int(key, value){ if (typeof value == 'string'){ return parseInt(value); } else { return value; } }
reviver参数函数通常用于将ISO 日期字符串的JSON表示形式转换为UTC格式的Date 对象。
【示例3】下面示例使用JSON.parse序列化ISO格式的日期字符串,在序列化过程中调用dateReviver()函数把每个成员的值进行转换,并返回Date格式的对象。
var jsontext2 = '{ "hiredate": "2015-01-01T12:00:00Z", "birthdate": "2015-12-25T12:00:00Z" }'; var dates = JSON.parse(jsontext2, dateReviver); document.write(dates.birthdate.toUTCString()); //输出:Fri, 25 Dec 2015 12:00:00 UTC function dateReviver(key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value; };
【提示】
JSON解析方法共有两种:eval和JSON.parse。eval在解析字符串时,会执行该字符串中的代码,由于用eval解析一个JSON字符串而造成原value的值改变。因此,在代码中使用eval是很危险的,特别是用它执行第三方的JSON数据(可能包含恶意代码)时,尽可能使用JSON.parse方法解析字符串本身。该方法可以捕捉JSON中的语法错误,并允许传入一个函数,用来过滤或转换解析结果。