Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   JSON с сервака, замучала "missing ; before statement" (https://javascript.ru/forum/misc/13160-json-s-servaka-zamuchala-missing-%3B-before-statement.html)

said46 18.11.2010 11:07

JSON с сервака, замучала "missing ; before statement"
 
два варианта кода, в первом JSON задается в самом скрипте (для проверки корректности JSON), второй генерит с помощью php то же самое. Первый вариант работает, второй выдает ошибку "missing ; before statement".
1:
if (xmlHttp.status == 200)
{
  var data = "[{id: '501', fio: 'Агафонов Н.Г.'}, {id: '518', fio: 'Болобанова Т.В.'}]";
  var resp = eval(data);
  for (i = 0; i <= resp.length-1; i++)
     p_object.options[i] = new Option(resp[i].fio, resp[i].id);
}

2:
if (xmlHttp.status == 200)
{
  var data = xmlHttp.responseText;
  var resp = eval(data);
  for (i = 0; i <= resp.length-1; i++)
     p_object.options[i] = new Option(resp[i].fio, resp[i].id);
}


Пробовал добавлять в php скрипт строку
header("Content-Type: application/json; charset=windows-1251");
, добавлять круглые скобочки, точку с запятой в разные места - не помогает

ЗЫ В принципе скрипт отрабатывает в FireFox и IE, но c ошибкой (текст ошибки получил с помощью FireBug)

Kolyaj 18.11.2010 11:26

В первом случае у вас data это массив, во втором -- строка. Примеры не эквивалентны.

said46 18.11.2010 11:28

исправил (добавил кавычки), проверил, 1 вариант рабочий

SV0L0CH 18.11.2010 12:10

Почему eval а не JSON.stringify ?

said46 18.11.2010 12:46

Ты имел ввиду JSON.parse? Ведь JSON.stringify - обратное преобразование.
Я так понял для этого надо подключать библиотеку, которая весит не меньше 2.5 килобайт.

said46 18.11.2010 13:11

JSON.parse в FF тоже выдает ошибку, но работает, IE не знает что такое JONS

B@rmaley.e><e 18.11.2010 13:20

data = '(' + data + ')';
Должно сработать. Если не работает - значит у Вас невалидный JSON.

JSON есть нативно в новых браузерах, для остальных подключать библиотеку.

SV0L0CH 18.11.2010 13:27

Цитата:

Сообщение от said46
Ты имел ввиду JSON.parse

Точно, спросонья попутал малость :p
Цитата:

Сообщение от said46
Я так понял для этого надо подключать библиотеку, которая весит не меньше 2.5 килобайт.

Да, если нужна поддержка древними браузерами.
Цитата:

Сообщение от said46
JSON.parse в FF тоже выдает ошибку

Я тут вгляделся в код, поля должны быть строками, тоесть в кавычках.
var data = "[{'id': '501', 'fio': 'Агафонов Н.Г.'}, {'id': '518', 'fio': 'Болобанова Т.В.'}]";

said46 18.11.2010 13:28

Со скобками работает, но выдает другую ошибку "missing ) in parenthetical". JSON точно валидный, потому что в php я тупо скопировал строку из первого примера.
Возможно что-то в настройках Апача кроется, или в php-ответе надо хедер какой-нибудь задать...

ЗЫ Apache/2.2.10 (Win32)

said46 18.11.2010 13:32

Цитата:

Сообщение от said46
Я тут вгляделся в код, поля должны быть строками, тоесть в кавычках.
var data = "[{'id': '501', 'fio': 'Агафонов Н.Г.'}, {'id': '518', 'fio': 'Болобанова Т.В.'}]";

кавычки добавлял, разницы не ощутил

Kolyaj 18.11.2010 13:48

Цитата:

Сообщение от said46
JSON точно валидный

JSON-то как раз точно не валидный, в валидном JSON кавычки должны быть, а не апострофы.

Вы покажите строку-то, которая присваивается из responseText.

said46 18.11.2010 13:55

содержимое php-скрипта, генерящего ответ от сервера:
<?header("Content-Type: application/json; charset=windows-1251");?>
[{"id": "501", "fio": "Агафонов Н.Г."}, {"id": "518", "fio": "Болобанова Т.В."}]

пробовал уже и с апострофами, и с кавычками... я же говорил, что содержимое php-ответа полностью совпадает с содержимым строки data в первом примере, который работает БЕЗ ошибок, т.е. валидность JSON вроде бы ни при чем.

Kolyaj 18.11.2010 13:58

У вас перенос строки здесь.

said46 18.11.2010 14:02

не понял где перенос строки?
кстати, попробовал сделать так:
Закинул в php строку вида "100:name1,200:name2", разобрал с помощью split, все работает без ошибок (идея с http://www.internet-technologies.ru/...ticle_526.html). Смущает только то, что, во-первых, это как то нестандартно, а во вторых, я еще хочу атрибуты к <options> прикрутить (доп. данные кроме атрибута value).

Kolyaj 18.11.2010 14:03

После отправки заголовка у вас идёт перенос строки. А в JSON не может быть переносов строк.

Хотя он тут не причём. Но убрать надо.

SV0L0CH 18.11.2010 14:05

а если просто скачать содержимое, то что там?

Kolyaj 18.11.2010 14:07

Вобщем покажите, что в Firefox-е покажет
alert(JSON.stringify(xmlHttp.responseText));

said46 18.11.2010 14:12

"[{\"id\": \"501\", \"fio\": \"Агафонов Н.Г.\"}, {\"id\": \"518\", \"fio\": \"Болобанова Т.В.\"}]"

SV0L0CH 18.11.2010 14:19

Выглядит вроде как валидно, может попробовать кодировку на utf-8 поменять?

said46 18.11.2010 14:22

менял, получаем все то же самое, только кракозябрами

said46 18.11.2010 14:30

Все что хотел сделал с помощью split. И инфа компактнее, и глюков нема.

B@rmaley.e><e 18.11.2010 15:00

Только если в name будет ':' или ',', то все поломается.

said46 18.11.2010 15:19

Вот над этим как раз и работаю, символы ведь не обязательно д.б. такими.

said46 18.11.2010 15:49

Разделители в виде '::' и '||' меня вполне устроили.

Dima-ti_Vator 01.08.2011 20:11

я не могу понять, куда вводить все это?


Часовой пояс GMT +3, время: 14:32.