JSON.parse 與 eval() 對於解析json的問題


1.eval()與JSOn.parse的不同

eval()

    var c = 1; //全局變量

    var jsonstr1 = '{"name":"a","company":"b","value":++c}'; var json1 = eval('(' + jsonstr1 + ')'); console.log(json1.value); 

c是全局變量為1,但是經過eval的解析,全局變量變成了2!(這樣的寫法是危險的)

 

JSON.parse

    var c = 1; //全局變量

    var jsonstr1 = '{"name":"a","company":"b","value":++c}'; var json2 = JSON.parse(jsonstr1); console.log(json2.value); 

IE下報錯:

谷歌下報錯:

而JSON.parse則會報錯。

 

2.在++c中加上雙引號則就可以,因為它變成字符串了。

 

 var c = 1; //全局變量

    var jsonstr1 = '{"name":"a","company":"b","value":“++c”}'; var json2 = JSON.parse(jsonstr1); console.log(json2.value);

 

結果:

 

3.我想很多人在糾結雙引號的問題,這里我們就來集中測試下。

   a:JSON.parse

var c = 1; //全局變量
    var date = new Date(); console.log(date.toLocaleDateString()); //var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//鍵,值都有雙引號
    var jsonstr2 = '{"name":"a","company":"b","value":++c}';//僅++c上午雙引號
    //var jsonstr3 = '{name:"a",company:"b",value:"++c"}';//僅有值上有雙引號
    //var jsonstr4 = '{name:a,company:b,value:++c}';//全無雙引號

    //var json1 = JSON.parse(jsonstr1);
    var json2 = JSON.parse(jsonstr2); //var json3 = JSON.parse(jsonstr3);
    //var json4 = JSON.parse(jsonstr4);

    //console.log(json1 );
 console.log(json2 ); //console.log(json3);
    //console.log(json4);

結果依次為:

可見JSON.parse中只有第一種標准形式才會解析正確

 

b:eval()

var c = 1; //全局變量
    var date = new Date(); console.log(date.toLocaleDateString()); var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//鍵,值都有雙引號
    //var jsonstr2 = '{"name":"a","company":"b","value":++c}';//僅++c上午雙引號
    //var jsonstr3 = '{name:"a",company:"b",value:"++c"}';//僅有值上有雙引號
    //var jsonstr4 = '{name:a,company:b,value:++c}';//全無雙引號

    var json1 = eval('('+jsonstr1+')'); //var json2 = eval('('+jsonstr2+')');
    //var json3 = eval('('+jsonstr3+')');
    //var json4 = eval('('+jsonstr4+')');
 console.log(json1+"    "+json1.value ); //console.log(json2+" "+json2.value );
    //console.log(json3 + " " + json3.value);
    //console.log(json4+" "+json3.value);

 

結果依次為:

而eval中除了最后一種,其他都解析正確。

 

4.這時候還有一個問題:那就是為什么eval()解析的時候要加上括號?

我們先看看不加括號會怎么樣:

var c = 1; //全局變量
    var date = new Date(); console.log(date.toLocaleDateString()); var jsonstr1 = '{"name":"a","company":"b","value":"++c"}';//鍵,值都有雙引號

    var json1 = eval(jsonstr1); console.log(json1+"    "+json1.value );

結果:

這里不加就出錯了。

那是因為eval()相當於一個執行環境,當你不加括號的時候,jsonstr1會被認為是一條復合語句。運行的時候就會逐個字符的解析。

但是加上括號的時候,jsonstr1就當做一個表達式去運算。從括號開始就被當做了對象進行識別。

 


5.然后你又會想到,那這個括號為什么要加“()”,不能加“{}”么?

答案是:當然能加“{}”,只不過就會報錯而已~。— —!

這時候你要明吧json的格式是什么!

{"name":"a","company":"b"} 這就是標准形式。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM