解析JSON

课后整理 2020-12-10

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

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