2013-04-23 4 views
1

Итак, у меня есть этот объект json, где структура является переменной в зависимости от того, как вы извлекаете данные. Допустим, объект выглядит в одном случае:Правильное использование eval в javascript?

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

, но выглядит, как это в другом случае:

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

Теперь для первого примера, они, как я динамически получать данные, как это :

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

Это позволяет мне настроить его. Просто обратите внимание, что это простой пример: в реальном коде есть только одна функция для анализа данных, и я бы передал dataLocation в качестве параметра.

Теперь мой первый вопрос заключается в том, есть ли лучшее желание достичь той же цели, не используя eval?

Если нет, то второй вопрос заключается в том, что мне нужно сделать для оператора eval, чтобы убедиться, что он безопасен (dataLocation никогда не должен передаваться от пользователя, он всегда будет из кода, но все же).

UPDATE

Основываясь на комментарий от Берги, сейчас я использую это:

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

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

точной копия [является его злым использовать Eval для преобразования строки функция?] (http://stackoverflow.com/questions/14396647/is-it-evil-to-use-eval-to-convert-a-string-to-a-function) – Bergi

+1

См. [тысячи способов сделать это лучше] (http://stackoverflow.com/a/14397052/1048572) – Bergi

ответ

2

Вы должны использовать кронштейн обозначения вместо eval:

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

Примечание : из вашего описания, то, что у вас есть, является литералом объекта JavaScript. JSON будет тем же самым объектом, который закодирован как строка (например, с JSON.stringify). Нет такой вещи, как «объект JSON», у вас либо есть объект JavaScript, либо строка JSON.

0

Вы можете использовать ключевые шаговые для объектов в JS:

var responseData response.data['users]'; 

То есть после того, как избавиться от data. в нашем DataLocation