2013-03-18 75 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代码可以正常工作。