Почему этот недействительный JSON? - PullRequest
1 голос
/ 19 февраля 2011

Я отправляю некоторые данные с сервера обратно на страницу. Для меня это похоже на действительный JSON, но он обрабатывается обработчиком ошибок в моем вызове jQuery.ajax ().

Это сообщение об ошибке:

Error: Invalid JSON: ({"id":"#settingsResult","payload":"<form id=\"pwd_change_frm\" action=\"post\">\n    <div>\n        <div>\n            <div><\/div>\n            <div><label for=\"changepwd_password\">New Password<\/label><\/div>\n            <div><input type=\"password\" name=\"changepwd[password]\" title=\"Enter new password\" style=\"width:258px;\" id=\"changepwd_password\" \/><\/div>\n        <\/div>\n        <div class=\"spacer\">&nbsp;<\/div>\n        <div>\n            <div><\/div>\n            <div><label for=\"changepwd_password_confirm\">Confirm New Password<\/label><\/div>\n            <div><input type=\"password\" name=\"changepwd[password_confirm]\" title=\"Retype new password)\" style=\"width:258px;\" id=\"changepwd_password_confirm\" \/><\/div>\n        <\/div>\n        <div class=\"spacer\"><\/div>\n        <div><img id=\"pwd_chg_btn\" class=\"submit_btn\" src=\"\/images\/button_submit.gif\" alt=\"Button_submit\" \/><\/div>\n    <\/div>\n    <input type=\"hidden\" name=\"changepwd[_csrf_token]\" value=\"1b7f3529797245c0fc43c3ddf5ade30d\" id=\"changepwd__csrf_token\" \/><\/form>\n<div class=\"spacer\"><\/div>"})

Кроме того, FF Firebug правильно анализирует возвращаемые данные и отображает их неправильно - вот почему я не понимаю, почему jQuery не может справиться с этим.

вот фрагмент кода, который делает вызов:

jQuery.ajax({
  type: 'POST',
  url: '/some_url?id='+this.id,
  timeout: 2000,
  success: function(result){ jQuery(result.id).html(result.payload); },
  error: function (xhr, ajaxOptions, thrownError){ alert('Error: '+ thrownError); }
});

Ответы [ 7 ]

4 голосов
/ 19 февраля 2011

Возможно, на данный момент отвечать бесполезно, но я просто подумал, что должен заметить, что проблема как-то связана с $.parseJSON().

Если я удаляю все вхождения \n и заменяювсе вхождения \" с \', это работает.

В качестве альтернативы, если я дважды убегаю от них, это работает.

\\n
\\"

... что имело бы смысл, поскольку я верюjQuery просто выполняет eval() (или фактически то же самое), поэтому я думаю, что экранирование " завершает строку, а экранирование \n вводит символ новой строки, где он будет недопустимым.

3 голосов
/ 19 февраля 2011

Из-за окружающего '()' удалите его и его действительный json.

1 голос
/ 08 марта 2011

Ошибка также появляется при использовании jquery validate (версия 1.7).Вы можете проверить: http://datatables.net/forums/comments.php?DiscussionID=3993&page=1#Item_16

Я также обновился до jquery 1.5.1, и у меня возникла та же проблема.После того, как я обновил jquery validate (отсюда: https://github.com/jzaefferer/jquery-validation) ошибка исчезла.

1 голос
/ 19 февраля 2011

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

0 голосов
/ 10 октября 2016

По данным json.org

JSON может быть массивом или объектом

Объект - это неупорядоченный набор пар имя / значение. Объект начинается с {(левая скобка) и заканчивается}

структура объекта

Массив - это упорядоченная коллекция значений. Массив начинается с [ (левая скобка) и заканчивается на

структура массива

Так что JSON должен начинаться с '{' или '[', и он не может начинаться с '('

Также вы используете следующий онлайн-валидатор, такой как debugjson.com, чтобы всегда проверять ошибки ввода JSON.

0 голосов
/ 19 февраля 2011

jquery требует, чтобы вы указали «dataType: json», если только вы не указали правильный тип контента в своем серверном коде, например «header» («Content-type: application / json ');»

0 голосов
/ 19 февраля 2011

Каков фактический JSON, который передается? Строка в сообщении об ошибке:

{"id":"#settingsResult",
 "payload":"\n \n \n <\/div>\n New Password<\/label><\/div>\n <\/div>\n <\/div>\n  <\/div>\n \n <\/div>\n Confirm New Password<\/label><\/div>\n <\/div>\n <\/div>\n <\/div>\n <\/div>\n <\/div>\n <\/form>\n<\/div>"}

действительно в соответствии с JSONLint . Вы включаете в себя паренов?

Обновление после изменения вопроса

Возможно ли, что <\/div> как-то запутывает вещи? Это недействительный HTML, поэтому я не знаю, что с ним будет делать jQuery(result.id).html(result.payload).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...