это сработало! Но я слышал некоторые страшные вещи о Eval?

учаю строку JSON из вызова ajax и хотел бы преобразовать значение в предопределенную переменную:

var predefined = "hello world";
var foo = {"msg":"predefined"}; // JSON string

Я хочу повторить стандартную строку доступа к нему с

alert(foo.msg)

РЕДАКТИРОВАТЬ: чтобы сделать ответ более ясным, вот мой звонок:

var success_msg = "Your email is send successfully!";

$.ajax({
    url: "ajax-share-email.php",
    type: "POST", 
    dataType: "json", 
    data: {},
    success: function(data) {
        if (data.status == "success") {
            msg.text(data.msg).addClass("email-msg-success");                   
        } else {
            msg.text(data.msg).addClass("email-msg-error");
        }
    }
})

ajax-share-email.php отвечает:

{"status":"success", "msg":"success_msg"}
 tvanfosson09 янв. 2011 г., 16:00
Почему бы не сохранить предварительно определенные сообщения на стороне сервера и просто отправить фактическое сообщение?
 Hemlock09 янв. 2011 г., 16:08
@tvanfosson Чтобы сохранить JSON маленьким, возможно.
 tvanfosson09 янв. 2011 г., 16:14
@Hemlock - да, возможно, есть случаи, когда это приведет к реальной выигрышу в производительности (например, большое количество больших сообщений и высокочастотные вызовы AJAX), но выполнение этого на стороне сервера приводит к упрощению клиента и более быстрой начальной загрузке. Мне нужно убедиться, что это действительно необходимо. Если вы экономите всего несколько десятков или даже сотен байтов на сообщение, действительно ли это необходимо?
 FFish09 янв. 2011 г., 16:10
Я пересматриваю это сейчас, ура!
 Phrogz09 янв. 2011 г., 16:10
@tvanfosson Еще одна веская причина - рассмотреть это с точки зрения MVC. Сервер может быть внешним API-интерфейсом, отправляющим информацию на уровне модели, а клиент выступает в качестве представления, преобразуя отвратительные коды ответов в симпатичные HTML и понятные человеку сообщения.

Ответы на вопрос(5)

что вы спрашиваете, я думаю, у меня есть все части здесь.

У вас есть переменнаяpredefined и вы хотите иметь возможность вернуть это в вашем json и иметь результирующий проанализированный объект, содержащий значение вpredefined

JSON.parse не будет работать для вас (по крайней мере, в Chrome), но eval будет.

var predefined = "Hi! I'm predefined";
// ...

var json = '{"foo": predefined}'; // notice no quotes
var response = eval("(" + json + ")");
alert(response.foo);
 Tamzin Blake11 нояб. 2011 г., 22:14
Upvoted. Именно то, что я искал.
 Hemlock09 янв. 2011 г., 16:49
@Phrogz Я не согласен. Это тот случай, когда eval полезен (хотя на самом деле может быть опасен с точки зрения инъекций). Это плохо, когда используется для замены скобки. Это колено страх передeval глупо
 Phrogz09 янв. 2011 г., 16:19
Downvoting потому что (как прокомментировал другой ответ): eval не только опасен в целом(хотя, возможно, не в этом случае), это также медленно, требуя, чтобы браузер раскручивал лексер и парсер. Это плохой ответ, когда требуется динамический поиск свойства, а также наивно поощряет использованиеeval и глобальные переменные. Есть очень мало случаев, когдаeval должен быть использован; Это не один из них.
 Hemlock09 янв. 2011 г., 18:34
Далее - Eval являетсябыстрый Решение, которое поддерживает более старые версии IE и предоставляет решение, которое соответствует форме вопроса.
var out = eval(foo.msg); // out is now "hello world"

eval() если вы не уверены, что содержаниеfoo.msg является.

или же

var out = foo.msg=="predefined" ? predefined : foo.msg;
 FFish09 янв. 2011 г., 16:08
это сработало! Но я слышал некоторые страшные вещи о Eval?
 user11371609 янв. 2011 г., 16:06
Почему это будет опущено? @Phrogz: Если данные из надежного источника, в чем проблема? +1
 Floern09 янв. 2011 г., 16:07
Я знаю, что это зло, но это способ получить результат
 Phrogz09 янв. 2011 г., 16:05
eval это зло и опасно. Практически нет случаев, когда его использование является хорошей идеей. (И это не один из них.)
 diagonalbatman09 янв. 2011 г., 16:08
проголосовал за вероятно использование eval (foo.msg) в одном из предложений
var predefined = "hello world";
var foo = {"msg":predefined}; // JSON string
alert(foo.msg)

встроенное в случае успеха, и даже не пытайтесь сделать его частью JSON. В случае ошибки включите все сообщение и используйте его напрямую. Кроме того, я бы попросил ваш сервер вернуть что-то вроде:

{ "status": true }

или же

{ "status": false, "msg": "The mail server is down." }

Тогда вы можете просто оценить его как логическое значение, не сравнивая его со строковым значением.

$.ajax({
    url: "ajax-share-email.php",
    type: "POST", 
    dataType: "json", 
    data: {},
    success: function(data) {
        if (data.status) {
            msg.text('Your email has been sent successfully!').addClass("email-msg-success");                   
        } else {
            msg.text(data.msg).addClass("email-msg-error");
        }
    }
});

Если и только если вы начнете многократно использовать свои сообщения для нескольких функций, то выполните рефакторинг к словарю сообщений и оттуда получите ссылку. Обратите внимание на вашmessages Вероятно, объект должен быть глобальной переменной или, по крайней мере, во внешней области видимости всех функций, которые его используют.

 var messages = {};
 messages.mail_success = 'Your email has been sent successfully!';
 messages.post_success = 'Your data has been updated!';

$.ajax({
    url: "ajax-share-email.php",
    type: "POST", 
    dataType: "json", 
    data: {},
    success: function(data) {
        if (data.status) {
            msg.text(messages.mail_success).addClass("email-msg-success");                   
        } else {
            msg.text(data.msg).addClass("email-msg-error");
        }
    }
});
 FFish09 янв. 2011 г., 17:14
+1 за логическое предложение.
Решение Вопроса
var strings = {"predefined":"hello world"};
alert(strings[foo.msg]);

или, например,

var messages = {};
messages.success_msg = "Your email is send successfully!";

// ...
            msg.text(messages[data.msg]).addClass("email-msg-success");             
 FFish09 янв. 2011 г., 16:34
О, вы оборачиваете это в объект. Большое спасибо за помощь!
 tvanfosson09 янв. 2011 г., 16:10
Если бы мне пришлось сделать это на клиенте, это, вероятно, метод, который я бы использовал. Однако я предпочел бы сохранить словарь сообщений на сервере и просто отправить фактическое сообщение клиенту. Я предполагаю, что есть случаи, когда загрузка всех сообщений (я должен предположить, что должно быть больше) на клиенте имело бы смысл, но я должен быть убежден.
 fuzzyTew09 янв. 2011 г., 16:29
@FFish Отредактировано, чтобы предоставить пример включения
 FFish09 янв. 2011 г., 16:24
как это работает в моем (отредактированном) вопросе?
 Phrogz09 янв. 2011 г., 16:11
+1 за то, что был единственным (или первым) человеком, который действительно понял, о чем спрашивают.

Ваш ответ на вопрос