两种方式都可以解析json字符串,不过有时候JSON.parse解析会失败,失败原因有多种,下面会指出一种。


JSON.parse()解析json格式的数据,会对要解析的字符串进行格式检查,如果格式不正确则不进行解析,

eval()则可以解析任何字符串,但是eval是不安全的(不安全原因在下面)。


注意:某些低级的浏览器尚不支持JSON.parse(),可以到 https://github.com/douglascrockford/JSON-js/blob/master/json2.js 下载。


使用eval函数,解析json字符串


var dataObj = eval(“(“+json+”)”);


加上圆括号的目的是,迫使eval函数在处理JavaScript代码时,强制将括号内的表达式(expression)转化为对象,而

不是作为语句(statement)来执行。


注意:使用eval函数解析JSON是一种很不安全的方式,能不用最好就不用,原因是eval不但可以解析JSON字符串,还会执行其中的代码块(如果有的话)


使用JSON.parse()方法解析


var dataObj = JSON.parse(json);


注意:JSON.parse()又是對字符串的真实含义进行解析,要表示 \ 必須要用"\\\\"表示。


使用JSON.parse()解析会报错的一种情况:


var Student = {  
age: "20",
sex:"male"
};
//错误做法
alert(JSON.parse(Student).age);//JSON.parse()不能直接解析对象
//正确做法
var jsonStr=JSON.stringify(Student);
alert(JSON.parese(jsonStr).age);


有时候





题外话:

JSON是Javascript原生格式,这意味着在javascript中处理JSON数据不需要任何特殊的API或工具包,而且效率非常高。


JSON.stringify

作用:用于序列化对象,可以理解为把对象类型或者字符串类型转换为JSON类型字符串


语法:JSON.stringify(value,[,replacer][,space])

value:必选,要输出的对象

replacer:可选,过滤器,有两种情况,一种是方法,一种是数组,具体看示例

方法:把序列化后的每个对象传递到方法里面进行处理,

数组:如果前面要转换的是一个对象,如{name:"zhang",age:"20"},则在数组包含的该key的元素会被筛选出来

space:可选,使用什么来分割,具体看示例

示例:


/*  * 只有第一个参数  */              var Student = {                   age: "20",                   sex:"male"               };               //stringify()用于从一个对象解析出字符串               var jsonString = JSON.stringify(Student);               alert(jsonString);                  var person = new Object();               person.name = "xiao wang";               person.age = "20";               person.location = "china";               var personjson = JSON.stringify(person);               alert(personjson);                  /*  * 有两个参数,第一个参数是对象,第二个参数是数组  */              var person = new Object();               person.name = "xiao wang";               person.age = "20";               person.location = "china";                  var filter = ["name"];                  var personjson = JSON.stringify(person,filter);               alert(personjson);   /*  * 有两个参数,第一个参数是数组,第二个参数是数组(计算结果是第二个参数忽略)  */    var person = ["zhangsan", "20", "male", "china"];               var filter = ["zhangsan", "china"];               var jsonperson = JSON.stringify(person, filter);               alert(jsonperson);      /*  * 有两个参数,第一个参数是数组,第二个参数是函数  */     function switchUpper(key, value) {                   return value.toString().toUpperCase();               }               var person = ["zhangsan", "20", "male", "china"];                              var jsonperson = JSON.stringify(person, switchUpper);               alert(jsonperson);                  /*  *有两个参数,第一个参数是对象,第二个参数是函数  */   var person = new Object();               person.name = "xiao wang";               person.age = "20";               person.location = "china";                  var jsonperson = JSON.stringify(person, function (key, value) {                   switch (key) {                       case "name":                           return "zhang";                       default:                           return value;                   }               });               alert(jsonperson);                /*  * 有三个参数,如果省略的话,那么显示出来的值就没有分割符,  * 如果是数组的话,那么它定义缩进的字符,如果大于10,则最多显示10个  * 如果是一些转义字符,如"\t",表示回车,那么它每一行一个回车  * 如果仅仅是字符串,就在每行输出值得时候把这些字符串附加上去,当然最大长度是10个字符  */   //空格    var person = ["name", "age", "sex", "location"];               var jsonperson = JSON.stringify(person, null, 20);               alert(jsonperson);               //字符               var person = ["name", "age", "sex", "location"];               var jsonperson = JSON.stringify(person, null, "hi");               alert(jsonperson);