нужна помощь с нечетным вопросом анализа JSON - PullRequest
0 голосов
/ 22 января 2011

У меня странные проблемы с разбором того, что я считаю правильно сформированным 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.

Идеи с благодарностью

UPDATE: Я обнаружил, что сервер неправильно устанавливает тип контента. В серверном PHP, который форматирует JSON для возврата (созданный в данном случае в Drupal 6 (мне пришлось взломать необязательное ядро, включающее «commons.inc»), я заменил тип контента на «application / json». теперь работает. Эта проблема была исправлена ​​в Drupal 7.

Ответы [ 2 ]

3 голосов
/ 22 января 2011

Если ваш цитируемый текст на самом деле , что возвращается, в комплекте с частью 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, что могло быть вашей проблемой.

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

Посмотрите мое обновление, как я решил проблему. Я прошу прощения за то, что не был более конкретным в моем оригинальном сообщении. Переменная 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

...