2013-03-18 108 views
-1

我從JSON格式的PHP函數中獲取數據。JavaScript eval()不能按預期工作

var xhReq = new XMLHttpRequest(); 
xhReq.open("GET", "http://myserver/getjson", false); 
xhReq.send(null); 
var serverResponse = xhReq; 

var jsondata=eval("("+serverResponse.responseText+")") //retrieve result as an JavaScript object 

images=""; 

for(var i=0; i<jsondata.length;i++) 
{ 
    images+=" ['"+jsondata[i].title+"','"+IMAGESROOT+"121a.png"+"']"; 


    if(i<jsondata.length-1) 
     images+=","; 
} 

我使用以下格式獲取此數據。

['title 1','http://site.com/images/121a.png'], 
['title 2','http://site.com/images/121a.png'], 
['title 3','http://site.com/images/121a.png'], 
['title 4','http://site.com/images/121a.png'] 

最後,當林使用eval分配這個數據作爲陣列()

var tinyMCEImageList = new Array(eval(images)); 

它僅示出排列的['title 4','http://site.com/images/121a.png']的最後一個元素。

我想要分配數組的每個元素。

+6

你應該真的*使用'JSON.parse(..)'代替。請參考:http://www.json.org/js.html – techfoobar 2013-03-18 08:47:12

+1

爲什麼你應該假設'eval()'會自動將'JSON'解析成一個數組。正如@techfoobar所說的,它應該是'JSON.parse()' – 2013-03-18 08:48:13

+0

這是什麼問題? – 2013-03-18 08:52:02

回答

2

簡單的解決辦法是

var tinyMCEImageList = eval('['+serverResponse.responseText+']'); 

var tinyMCEImageList = JSON.parse(
    '['+serverResponse.responseText.replace(/'/g, '"')+']' 
); 

但是一個更好的解決辦法是通過添加缺少[],並使用合適的報價產生JSON,這將讓你直接使用JSON.parse。請注意,PHP標配所有到generate JSON的工具。

0

試試這個

var tinyMCEImageList = new Array(); 
for(var i=0; i<jsondata.length;i++) 
{ 
    images+=" ['"+jsondata[i].title+"','"+IMAGESROOT+"121a.png"+"']"; 


if(i<jsondata.length-1) 
    images+=","; 

    tinyMCEImageList[]=images 
} 
0

試試這個:

var jsondata=eval("(["+serverResponse.responseText+"])") //retrieve result .. 

四個要素缺乏陣列封裝,最後又回來只分配。

0

在JavaScript中,括號,(),可能意味着兩種情況之一:

  1. 在函數結束時,它會觸發一個函數調用。

  2. 在表達式中,它將覆蓋運算符優先級。

所以,因爲你試圖評估的是一個表達式,它看起來像2號正在發生。注意上面兩個含義是大括號在javascript中唯一的含義。例如,花括號不能像Perl中那樣用作分組或列表運算符。

接下來我們遇到逗號運算符。在JavaScript中,逗號,,,可能意味着以下四種情況之一:

  1. 在一個函數調用,傳遞給函數的逗號分隔參數。

  2. 在數組中,逗號分隔數組成員。

  3. 在對象字面上,逗號分隔對象成員。

  4. 在表達式中,逗號是逗號運算符。

什麼是逗號運算符?逗號運算符是一個接受兩個表達式的運算符,對兩者進行求值並返回第二個。因此,可以說,你有3個表現形式X,Y和Z.下面一行:

X, Y, Z 
在JavaScript

基本一樣:

(X , Y) , Z 

所以當然上面的表達式首先計算X則Y然後返回Y作爲結果,然後返回Y,然後返回Z並返回Z作爲結果。

所以你看到的是第4行爲:作爲逗號操作符的逗號。

我懷疑你想要的是行爲2:爲逗號作爲數組分隔符。如果是這樣,你正在評估的字符串是錯誤的。它應該是:

"[" + your_string + "]" 

這意味着您收到的數據不是JSON(或者說,無效的JSON)。通過執行上述操作可以解決您在JavaScript中解析非JSON字符串的問題。或者你可以在PHP中做到以上的數據有效的JSON,以便您的JavaScript代碼可以正常工作。