JSON 教程,JSON 在线

877JSON.parse()

obj.alexa = eval("(" + obj.alexa + ")");

不知道大家有木有注意到 eval() 还要用一对圆括号将字符串包起来,对此我寻找到比较好的解释就是

原因:归结于 eval 本身的问题,由于 json 是以 {} 的方式来开始以及结束的,在 JavaScript 中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

解决方法:加上圆括号的目的是迫使 eval 函数在处理 JavaScript 代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执 行。举一个例子,例如对象字面量 {},如若不加外层的括号,那么 eval 会将大括号识别为 JavaScript 代码块的开始和结束标记,那么 {} 将会被认为是执行了一句空语句。

876JSON.parse()

使用 JSON.parse 的 reviver 函数时一定要注意遍历到最后的顶层对象 key 为 "",需要返回 value。

var json = '{"name":"Harvy", "age":36, "gender":"male"}';
var person = JSON.parse(json, function (key, value) {
    if(key != "")
        return ""+value+"";
    else
        return value;
});

875JSON.parse()

对于服务器返回的JSON字符串,如果 jQuery 异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于 eval()中执行一次。这种方式也适合以普通 javascipt 方式获取 json 对象,以下举例说明:

var u = eval('('+user+')');

为什么要 eval 这里要添加 ('('+user+')') 呢?

原因在于:eval 本身的问题。 由于 json 是以 {} 的方式来开始以及结束的,在 js 中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

加上圆括号的目的是迫使 eval 函数在处理 JavaScript 代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量 {},如若不加外层的括号,那么 eval 会将大括号识别为 javascript 代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:

alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]

测试实例

var user = '{name:"张三",age:23,'+   
    'address:{city:"青岛",zip:"266071"},'+    'email:"iteacher@haiersoft.com.cn",'+  
    'showInfo:function(){'+  
    'document.write("姓名:"+this.name+"
");'+ 'document.write("年龄:"+this.age+"
");'+ 'document.write("地址:"+this.address.city+"
");'+ 'document.write("邮编:"+this.address.zip+"
");'+ 'document.write("E-mail:"+this.email+"
");} }'; var u = eval('('+user+')'); u.showInfo();

尝试一下 »

874JSON.parse()

eval(string):函数可计算某个字符串,并执行其中的的 JavaScript 代码。

eval("var a=1");     // 声明一个变量a并赋值1。
eval("2+3");         // 执行加运算,并返回运算值。
eval("mytest()");    // 执行mytest()函数。
eval("{b:2}");       // 声明一个对象。

873JSON 数组

删除数值的元素,数组的大小不变,代码如下:


var myObj, i, x = "";
myObj = {
    "name":"网站",
    "num":3,
    "sites":[ "Google", "Facesoho", "Taobao" ]
};
delete myObj.sites[1];

x = "sites.length = " + myObj.sites.length + "<br><br>";
    
for (i in myObj.sites) {
    x += i + " " + myObj.sites[i] + "<br>";
}
document.getElementById("demo").innerHTML = x;

尝试一下 »


delete 运算符并不是彻底删除元素,而是删除它的值,但仍会保留空间。



运算符 delete 只是将该值置为 undefined,而不会影响数组长度,即将其变为稀疏数组(《JS权威指南》7.5节)。


更多内容可参考:JS 中彻底删除 JSON 对象组成的数组中的元素