JSON.parse()

课后整理 2020-12-20

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()将为对象的每个成员调用该参数函数。如果成员包含嵌套对象,则先于父对象转换嵌套对象。对于每个成员,会发生以下情况: 

【示例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中的语法错误,并允许传入一个函数,用来过滤或转换解析结果。