Нужна помощь с нечетной проблемой анализа json
У меня странные проблемы с синтаксическим анализом того, что я считаю правильно сформированным json, возвращенным из вызова ajax (используя jQuery 1.4.4). Как ни странно, на моем сервере dev он работает нормально, но не работает в сети.
Данные возвращаются из вызова ajax следующим образом:
returnData = { "status": true, "data": { "error_return": false, "error_index": -1, "message_display": { "main_message": "hello", "name": "tommy tune the man", "mailed_to": "t@t.com", "subject": "I tried this", "subject_message": "you have a technical question or comment.", "test_me": "you have a technical question or comment." } } };
jsLint и jsonLint оба проверяют эту структуру.
Ошибка возникает при попытке доступа к returnData.data
В случаях "сбоя" я удалил dataType из опций jQuery.ajax, что позволило использовать функцию "наилучшего предположения". Если я указываю json, jQuery выдает ошибку синтаксического анализа, утверждая, что недействительный json. Я пробовал все виды вещей (в том числе страшный eval() и плагин jquery-2json, но не повезло. Даже утилита jQ jQuery.parseJSON дает сбой.
Проблема возникает как в FF 3.6.13, так и в последней версии Safari / Chrome.
Вопрос 1: кто-нибудь, почему знает, что последняя версия jQuery выдает ошибку разбора?
Вопрос 2: когда я попробую следующее, у меня будет успех:
- var success = returnData.status;
НО следующее не определено:
- var errorReturn = returnData.data.error_return.
Как ни странно, Firebug видит это как объект, если я "вставляю" объект в консоль, но внутри скрипта 1) возвращает "нет дочерних объектов" в console.dir 2) НО отобразит объект в console.log.
Идеи с благодарностью
ОБНОВЛЕНИЕ: я обнаружил, что сервер неправильно устанавливает тип контента. В серверном PHP, который форматирует JSON для возврата (созданный в данном случае в Drupal 6 (мне пришлось взломать необязательное ядро, включающее "commons.inc"), я заменил тип контента на "application/json". теперь работает. Эта проблема была исправлена в Drupal 7.
2 ответа
Если ваш цитируемый текст на самом деле то, что возвращается, дополните return_data =
часть, то это неверный JSON.
Если ваш вызов ajax выглядит так:
$.ajax({
url: "your_url",
success: function(data) {
}
});
... и внутри success
Вы хотите получить доступ к status
значение, ваш JSON должен выглядеть так:
{ "status": true, "data": { "error_return": false, "error_index": -1, "message_display": { "main_message": "hello", "name": "tommy tune the man", "mailed_to": "t@t.com", "subject": "I tried this", "subject_message": "you have a technical question or comment.", "test_me": "you have a technical question or comment." } } }
(Примечание, нет return_data =
в начале нет ;
в конце.)
...и ваш success
функция должна выглядеть так:
success: function(data) {
if (data.status) {
// ...
}
}
Этот пример работает с последними версиями Chrome, Firefox, Opera, ..., используя последнюю версию jQuery. Возможно, на каком-то этапе вы использовали парсер JSON, который использовал eval
под одеялом. Ваш приведенный пример является допустимой буквенной нотацией объекта JavaScript как частью оператора присваивания, но не является допустимым JSON. Некоторые парсеры "JSON" действительно используют eval
для анализа JavaScript, а не JSON, возможно, это была ваша проблема.
Смотрите мое обновление, как я решил проблему. Я прошу прощения за то, что не был более конкретным в моем оригинальном посте. Переменная returnedData
на самом деле в обратном вызове успеха (извините за не указание.)
Для ясности я использую следующее с функцией jQ submit() (в обработчике кликов для отправки этой формы):
var ajaxOptions = {
type: 'POST',
url: url,
dataType: "json",
beforeSubmit: checkInput,
success:
evaluateResponse
}
e.preventDefault();
$(this).ajaxSubmit(contactOptions);
Где обратный вызов успеха:
function
evaluateContactResponse(returnData) {
//and so on }
(Примечание: я использовал плагин формы jQ до тех пор, пока эти ошибки не возникли, но перешел на другую реализацию, поскольку плагин формы не работал автоматически. Теперь я могу переместить его обратно, так как плагин формы такой элегантный.)
В обратном вызове "valuResponse" происходит синтаксический анализ, и, как я уже сказал, теперь работает.
Еще раз спасибо... ты умный парень N