2010-01-22 68 views
0

當我執行eval函數時,它不會將我的json響應轉換爲對象,它只會破壞我的代碼。我試着解析prototype.js和JSON2.js無濟於事,請解釋我在這裏做錯了什麼?爲什麼不是我的eval將json字符串轉換爲對象

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
     <title>Inventory Management</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
     <title>Untitled Document</title> 
     <script src="call.js" type="text/javascript"></script> 
     <script src="prototype.js" type="text/javascript"></script> 
    </head> 
    <body> 
    <div> 
      <p id="resp" >new</p> 
     <script type="text/javascript"> 



    var xhr; 
    var results=getPlants(xhr,results); 
    var plants; 


    function getPlants(xhr,results){ 
     try { 
      xhr=new XMLHttpRequest(); 
      }catch(microsoft){ 
      try{ 
       xhr=new ActiveXObject("Msxml2.XMLHTTP");     
       }catch(othermicrosoft){ 
        try{ 
       xhr = new ActiveXObject("Microsoft.XMLHTTP");    
        }catch(failed){ 
         xhr=false; 
         alert("ajax not supported"); 
        } 
       }    
     } 
     xhr.onreadystatechange= function() { 
     if(xhr.readyState==4 && xhr.status==200) { 
     results = xhr.responseText;      
     }  
} 
    xhr.open("GET","db_interactions.php",true);  
    xhr.send(null); 
    alert("sent"); 
return results; 

} 

plants = eval('('+results+')'); 

document.write(typeof(plants)); 
     </script> 

    </div> 

    </body> 
</html> 

回答

3

您正在發出異步請求。這意味着即使數據尚未準備好,該功能也會返回。但是您的調用假定調用getPlants時JSON響應已準備就緒。這顯然使得results未定義,因爲你不在等待它。

把你

plants = eval('('+results+')'); 
document.write(typeof(plants)); 

裏面的xhr.onreadystatechange功能,使其工作,或打開連接,同步

xhr.open("GET","db_interactions.php",false); 

順便說一句,不使用eval解析JSON因爲代碼可能會被惡意注入。改用JSON解析器。

+0

響應來自可信來源,當我打印getPlants定義之外的結果時,它會返回正確的數據,我試圖弄清楚的是我如何使用eval函數不會正確反序列化數據,並序列化我使用的數據php_encode – 2010-01-22 18:23:07

+1

您不知道「受信任」源是否在其他地方存在導致您使用XSS的漏洞。總是最小化攻擊面。另外,JSON解析器可能比'eval'快(在我的Safari上''eval'解析JSON的時間比'JSON.parse'多36%。 – kennytm 2010-01-22 18:49:09