Сообщение о синтаксических ошибках в объекте JSON с помощью jQuery и / или Javascript - PullRequest
3 голосов
/ 23 июня 2009

Какой лучший способ сообщить о синтаксической ошибке, когда я загружаю канал JSON с помощью jQuery? Я могу установить параметры отчетов об ошибках следующим образом:

error: function(xhr){
    alert('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText);
}

однако эта функция не срабатывает, когда URL-адрес, который я вызвал, загружает допустимую страницу (хотя и не содержащую JSON-объект). Более того, я не могу проверить данные, которые он возвращает, потому что (по крайней мере, в соответствии с Firebug) jQuery.getJSON прерывается из-за синтаксической ошибки, прежде чем он передает объект в функцию, которая его выполняет.

Причина, по которой я хотел бы сообщить об ошибках, заключается в том, что это мой способ проверки, предоставил ли пользователь URL-адрес, который будет создавать действительный канал JSON.

Вот ответ, связанный с , который требует контроля над тем, что сервер ответит . Вот синтаксическая ошибка, которую дает мне Firebug Синтаксическая ошибка, которую Firebug дает мне http://img.skitch.com/20090623-8c97g47jha4mn6adqqtjd41cwy.jpg

Есть идеи? Спасибо

Ответы [ 4 ]

3 голосов
/ 23 июня 2009

Вы можете привязать функцию к глобальным событиям ajaxerror

$(document).ajaxError(function(event, request, ajaxOptions, thrownError){
  if ( 4==request.readyState) { // failed after data has received
    alert(ajaxOptions['url'] + " did not return valid json data");
  }
  else {
    alert("something else wnet wrong");
  }
});
или используйте $ .ajax () вместо $ .getJSON ()
function foo() {
  // $.getJSON("<a href="http://localhost/test.txt" rel="nofollow noreferrer">http://localhost/test.txt</a>", function(data){});
  $.ajax({
    type: "GET",
    url: "<a href="http://localhost/test.txt" rel="nofollow noreferrer">http://localhost/test.txt</a>",
    success: function (data, textStatus) {
      alert("succuess");
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      alert("request failed: " + textStatus);
    },
    dataType: "json"
  });
}

edit: Но вы можете иметь в виду, что оба ajax (dataType: "json") и getJSON () (который просто вызывает .ajax (dataType: "json) ") сводится к data = window["eval"]("(" + data + ")") ... это может быть не то, что вам нужно, если вы не знаете, какие (произвольные) данные запрашивает ваш скрипт. И это может объяснить, почему firebug перехватывает синтаксическую ошибку при подаче html-кода документ вместо данных JSON.
В этом случае лучше запросить dataType: «string» и запустить данные через полноценный json-анализатор lib.

1 голос
/ 07 июля 2009

Спасибо всем, кто ответил. Поскольку я вызывал фид JSON из внешнего домена, я не мог просто использовать функциональность JJuery AJAX и перенаправлять фид как «текст» вместо «json». jQuery позволяет вам извлекать только «json» и «script» из удаленного источника.

Вместо этого я написал PHP-скрипт для выполнения внешнего вызова, который жил на моем собственном сервере. Я использую jQuery AJAX для вызова этого, передаю запрашиваемый источник в URL, а затем беру это как «текст». Затем я запускаю собственную проверку, чтобы убедиться в правильности форматирования JSON, а затем анализирую ее с другой библиотекой. В данный момент jQuery не имеет возможности анализировать JSON; $ .getJSON работает, только если вы передаете ему URL.

0 голосов
/ 23 июня 2009

Добавляя к ответу Диодея, вставьте свой потенциально нарушающий JSON в этот инструмент: http://jsonformatter.curiousconcept.com/

Если у вас есть firebug, вы можете даже взломать способ использования сайта службой программно, хотя это может быть неодобрительно.

0 голосов
/ 23 июня 2009

Вызовите URL-адрес или запрос XHR непосредственно в адресной строке браузера, создайте источник просмотра и вставьте результат в среду IDE, которая понимает JavaScript. Вы, вероятно, заметите неуместную цитату или что-то в этом роде.

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

...