Почему jQuery.parseJSON () не работает на всех серверах? - PullRequest
7 голосов
/ 20 января 2011

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

На некоторых серверах Apache jQuery.parseJSON() выдает invalid json исключение для того же json, которое он отлично анализирует на других серверах. Это исключение выдается только в Chrome и IE.

Содержимое json кодируется с использованием функции php json_encode(). Я попытался отправить правильный заголовок с данными json и установить юникод в utf-8, но это не помогло.

Это один из ответов json, который я пытаюсь проанализировать (убрал вторую часть if, потому что он длинный):

{"pageTitle":"\u062e\u0637\u0623 \u0639\u0646\u062f \u0627\u0644\u0625\u0631\u0633\u0627\u0644 !"}

Примечание : этот язык этих данных является арабским, поэтому он выглядит так после разбора php json_encode().

Вы можете попытаться сделать запрос в приведенных ниже примерах и просмотреть полные данные ответов, используя инструменты разработчика firebug или webkit. Ответ проходит jsonlint !

Наконец, у меня есть два URL-адреса, использующих одну и ту же версию скрипта, попробуйте просмотреть их с помощью chrome или IE, чтобы увидеть ошибку в сломанном примере.

Рабочий пример : http://namodg.com/n/

Нерабочий пример : http://www.mt -is.co.cc / my / call-me /

Обновлено: Чтобы уточнить больше, я хотел бы отметить, что мне удалось исправить это, используя старый eval() для анализа содержимого, я выпустил другую версию с этим исправлением, это было так :

// Parse the JSON data
try
{
    // Use jquery's default parser
    data = $.parseJSON(data);
}
catch(e)
{
    /*
     * Fix a bug where strange unicode chars in the json data makes the jQuery
     * parseJSON() throw an error (only on some servers), by using the old eval() - slower though!
     */
    data = eval( "(" + data + ")" );
}

Я все еще хочу знать, является ли это ошибкой в ​​методе parseJSON() jquery, чтобы я мог сообщить об этом им.

Ответы [ 3 ]

6 голосов
/ 20 января 2011

Обнаружил проблему! Было очень трудно заметить, но я увидел что-то забавное в этой открывающей скобке ... казалось, что там было несколько маленьких точек. Я использовал этот букмарклет JavaScript, чтобы узнать, что это было:

javascript:window.location='http://www.google.com/search?q=u+'+('000'+prompt('String?').charCodeAt(prompt('Index?')).toString(16)).slice(-4)

Я получил Страница результатов . Угадай, в чем проблема! В начале вашего вывода есть невидимый персонаж, который фактически повторяется дважды. Неразрывный пробел нулевой ширины также называется метка порядка байтов Unicode (BOM) . Это причина, по которой jQuery отклоняет ваш действительный JSON, и почему вставка JSON в JSONLint работает таинственно (в зависимости от того, как вы это делаете).

Один из способов вставить этот нежелательный символ в вывод - сохранить файлы PHP с помощью Блокнота Windows в режиме UTF-8! Если это то, что вы делаете, найдите другой текстовый редактор, например Notepad ++ . Сохраните все ваши файлы PHP без спецификации, чтобы решить вашу проблему.

Шаг 1: Настройка Notepad ++ для кодирования файлов в UTF-8 без спецификации по умолчанию. UTF-8 without BOM setting in New Document tab of Preferences

Шаг 2: Откройте каждый существующий файл PHP, измените настройку Кодировки и сохраните ее заново. Encoding...Encode in UTF-8 without BOM

1 голос
/ 20 января 2011

Вы должны попробовать использовать json2.js (он на https://github.com/douglascrockford/JSON-js)

Даже Джон Резиг (создатель jQuery) говорит, что вы должны:

Эта версия JSON.jsНастоятельно рекомендуется. Если вы все еще используете старую версию, пожалуйста, обновите ее (эта, несомненно, вызовет меньше проблем, чем предыдущая).

http://ejohn.org/blog/the-state-of-json/

0 голосов
/ 20 января 2011

Я не вижу ничего, связанного с parseJSON ()

Единственное отличие, которое я вижу, состоит в том, что в рабочем примере установлен cookie-файл сеанса (предположим, он необходим для "капчи", математическойрасчет), в другом примере сессия cookie не установлена.Так что, возможно, сравнение результата вычисления завершится неудачно без cookie-файла сеанса.

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