Грабли: json, eval и скобки

Несмотря на то, что в слове AJAX последняя буква явно показывает на то что пересылаться должны таки xml-ники, на деле это очень не удобно, громоздко и геморойно. Раньше, когда я использовал Prototype.js я просто юзал Ajax.Updater - генерил html-код на серваке - и напрямую вставлял его куда надо.  Потом, поняв, что под прототайп не так уж много чего и есть - перешел на jQuery - и познакомился с json-ом.

И все бы зашибись - jQuery с ним работает как с родным (впрочем для javascript-а) он и есть родной, на обработку приходят уже сгенерированые объектики и т.п. все было классно и супер пока мне не попался проект, написанный с использованием прототайпа. Естесственно, на стороне сервера я по-привычке сделал json_encode - однако на клиент пришла именно что строка json. Что с ней делать я не знал - и полез курить гугл. Оказалось, что надо сделать eval, что вполне логично, потому что запись json - это ничто иное как короткая запись анонимного объекта javascript. Но это не работало. Никак. Ваще никак. json = eval(responseText) никак не хотел работать хоть ты убейся. Полчаса я пытался допереть в чем же все-таки дело, оказалось, что в такой записи json надо обрамлять скобками, т.е.:

json = eval( '(' + responseText + ')' );

вот так. Почему - хз. Перед тем как писать эту статью я честно перерыл все что можно было перерыть, но так и не смог найти, собсна почему это нужно делать именно так. Все что я нашел, это какую-то муть про Invalid Label, почему же она возникает тоже не понятно ни разу. Тем не менее, сути дела это не меняет - грабли с json-ом и евалом так и будут граблями, которые просто нужно запомнить как таблицу умножения и никогда на них не наступать :)

  • Zeroglif

    В js конструкция-выражение не может начинаться с фигурной скобки или со слова function. Иначе парсер (eval) может принять конструкцию-выражение за блок или за объявленную функцию. Поэтому принято с помощью скобок уточнять, что это именно выражение…

  • admin

    Спасибо :) приятно что кто-то таки читает :)

  • http://gligvi.com Tom Nutwood

    Читают, факт. П.С. Спасибо за интересный блог!

  • phpize

    1) да, да… читаемс…

    2) а если опять на грабли – то в google and GOTO 1.

  • Илья

    +1 Спасибо

  • Roma

    спасибо.
    тоже косяк был такой)

  • http://semero.com/blog серый

    Хм. наступи на эти грабли, но первая же ссылка гугла спасла мир ))))

    А вообще конечно юзать eval не есть гуд.

  • Iorlin

    а если Вы передаете многомерный массив объектов, то нужно использовать квадратные скобки:

    json = eval( ‘[' + responseText + ']‘ );

  • http://busroot.com Roman

    Пилять, пол часа зарубил на этой фигне.))
    Спасибо.

  • Tenhi

    Спасибо!

  • Дима

    Действительно, много бы времени угробил, если б не залез в гугл и не попал на этот сайт. Спасибо за помощь и сэкономленное время!


Информеры с тИЦ и PR: получить код для сайта