2013-04-23 33 views
1

所以我有这个json对象,其结构是可变的,这取决于你如何检索数据。可以说物体看起来像这样的一个案例:在javascript中正确使用eval?

{ 
    "status": "success", 
    "data": { 
    "users": [...] 
    } 
} 

但在另一种情况是这样的:

{ 
    "status": "success", 
    "data": { 
    "posts": [...] 
    } 
} 

现在的第一个例子,他们的方式我动态获取的数据是这样的:

var dataLocation = 'data.users'; 
var responseData; 
eval('responseData = response.' +dataLocation + ';'); 

这让我来配置它。请注意,这仅仅是一个简单的例子,在真正的代码中,只有一个函数来解析数据,并且我将传入dataLocation作为参数。

现在我的第一个问题是,如果不使用eval,是否有更好的想要达到同样的目标?

如果没有,第二个问题是我需要怎样做eval语句以确保它是安全的(dataLocation不应该从用户传入,它总是来自代码但仍然)。

UPDATE

基于从BERGI的评论,我现在使用的是这样的:

var parts = dataListLocation.split('.'); 

for(var x = 0; x < parts.length; x += 1) { 
    responseData = responseData[parts[x]]; 
} 
+0

精确复制一个函数?](http://stackoverflow.com/questions/14396647/is-it-evil-to-use-eval-to-convert-a-string-to-a-function) – Bergi 2013-04-23 14:23:16

+1

请参阅[千方法做这更好](http://stackoverflow.com/a/14397052/1048572) – Bergi 2013-04-23 14:24:24

回答

2

您应该使用括号记号代替eval

var responseData = response['data']['users']; 

注:从你的描述中,你所拥有的是一个JavaScript对象文字。一个JSON可以是编码为一个字符串的相同对象(例如,使用JSON.stringify)。没有“JSON对象”这样的东西,你可以有一个JavaScript对象或一个JSON字符串。

0

您可以使用对象键索引在JS:

var responseData response.data['users]'; 

这是我们dataLocation摆脱data.

的[被它的邪恶使用eval将字符串转换为