ECMAScript 5提供一个全局的JSON对象,用来序列化和反序列化对象为JSON格式。
【提示】
如果浏览器不支持该功能,可以考虑使用Douglas Crockford的json2.js插件(https://github.com/douglascrockford/JSON-js/blob/master/json2.js),确保浏览器实现同样的功能。
JSON.parse()能够把JSON格式的文本转换成一个ECMAScript值(如对象或者数组)。用法如下。
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中的语法错误,并允许传入一个函数,用来过滤或转换解析结果。