с помощью jQuery обращайтесь к json из междоменного URL, где json может быть сформирован плохо - PullRequest
5 голосов
/ 28 ноября 2009

Я использую функцию jjuery ajax, чтобы попасть в междоменный URL. URL вернет JSON. Я нахожусь в фазе обнаружения с этим, но я думаю, что значения json содержат несколько строк '& quot', json eval выдает ошибку и останавливает выполнение моего скрипта на стороне клиента. Ошибка, которую я получаю, это «неопределенный строковый литерал». Я знаю, что если я жестко закодирую возвращенный json, поместив его в локальный div и убрав '& quot;' Строки (и несколько скрытых специальных символов), я могу получить JSON успешно eval. Будь то обходной путь или исправление моего кода, что я могу сделать, чтобы получить json из URL и сохранить его в моем клиентском javascript как действительный объект json?

мой текущий код. ни одна из определенных функций (success, complete, error, dataFilter) не выполняется:

$(function() {
  $.ajax({
  url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
  dataType: "jsonp",
  success: successFunc,
  complete: completeFunc,
  error: errorFunc,
  dataFilter: dataFilterFunc
});

});

function successFunc() { console.log('successFunc(). enter.'); }
function completeFunc() { console.log('complete(). enter.'); }
function errorFunc() { console.log('errorFunc(). enter.'); }
function dataFilterFunc(data, type) { 
  data.replace(/\W/g, ' ');
  return data; 
}

Ответы [ 5 ]

3 голосов
/ 28 ноября 2009

Проблема в службе JSONP, она полностью исключает параметр callback.

A JSONP response - это просто вызов функции с использованием параметра get callback в качестве имени функции:

Если вы посмотрите ответ какого-либо сервиса JSONP, он должен выглядеть следующим образом:

http://somesite.com/jsonp?callback=myCallback

Вернется:

myCallback({/*json*/});

Пока тот , который вы публикуете , возвращает plain valid JSON, но он не может быть обработан как JSONP ответ.

1 голос
/ 28 ноября 2009

Хм. Я не знаю jQuery, но я знаю JSON. (Я написал для него синтаксический анализатор на C ++.) Я пошел на URL, который вы показываете: http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?. Парсер JSON Python принимает это, и мой опыт показывает, что парсер JSON Python является правильным. Обратите внимание, что это:

{ "blah": "string " More more more" }

... действителен JSON. Часть " не получает специальной интерпретации в JSON - это просто символы в строке.


Редактировать: Глядя на это усерднее, я нахожу очень интересным, что то, что генерирует это, ускользает от некоторых косых черт, но не от всех. Элементами «Пуск» являются «/ Дата (-XXXXX) /», то есть текст /Date(-XXXXX)/ - / в JSON может быть экранирован. Однако в элементах с ключами «SpeakerURI» и «URI» они не экранируются.


Редактировать: Выполнить это через мой синтаксический анализатор на C ++. Изначально это не сработало, но этот JSON фактически выявил ошибку в моем парсере.

0 голосов
/ 28 ноября 2009

Кажется, я не ближе к решению на стороне клиента. Я изменил код для использования jQuery-jsonp. Теперь это выглядит так:

$(function() {
  $.jsonp({
  url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
  async: false,
  dataType: "jsonp",
  success: successFunc,
  complete: completeFunc,
  error: errorFunc,
  dataFilter: dataFilterFunc
});

});

function successFunc(json, textStatus) { 
  console.log('successFunc(). enter.'); 
}
function completeFunc(xOptions, textStatus) { 
  console.log('complete(). textStatus: ['+textStatus + ']'); 
}
function errorFunc(xOptions, textStatus) { 
  console.log('errorFunc(). textStatus: [' + textStatus + ']'); 
}
function dataFilterFunc(j) { 
  console.log('dataFilterFunc(). enter.');
  return j; 
}

Журнал консоли Firebug отображает:

X unterminated string literal
[{"URI"..... ( the json returned from the server
errorFunc(). textStatus: [error]
complete(). textStatus: [error]

По какой-то причине анализ json в моем браузере Firefox (FF v3.0.15, Linux Ubuntu 9.0.4) вызывает исключение «неопределенный строковый литерал». Я знаю, если я удалю строки '& q u o t' и два символа в блоке 'Maintainable ASP.NET MVC', тогда json будет успешно проанализирован. Поскольку у меня нет никакого контроля на стороне сервера, могу ли я что-нибудь сделать с клиентским javascript, который в итоге получит строку json сервера, как есть, в объекте json на стороне клиента. Я думал, что свойство dataFilter для jsonp было настроено именно для этой цели, чтобы перехватить json и «очистить» его. Однако эта функция в моем коде не вызывается, вполне возможно, потому что json, который передается в функцию dataFilterFunc, не будет успешно проанализирован.

0 голосов
/ 28 ноября 2009

После анализа ваших данных за час,

Я нашел следующее

{
   "URI":"/rest/sessions/Maintainable-ASPNET-MVC",
   "Title":"Maintainable ASP.NET MVC",
   "Abstract":".....\u003e\u2028Duration: 60-90 minutes\u003cbr\u003e\u2028Subject Area: development....."
}

Перед продолжительностью есть символ и предметная область,

\ u2028 - это разделитель строк, так что это значит, что-то вроде \ n, так что у вас есть разрыв строки между кавычками "", это может быть корень.

Если вы удалите это, вы не увидите неопределенный строковый литерал в firebug.

Чтобы проверить это, вставьте следующее в адресную строку, Firefox и Opera не работают, в то время как IE8 и Chrome работают

javascript:alert(eval('[{"Abstract":"\u003e
    Duration: 60-90 minutes\u003cbr\u003e
    Subject Area: development."}]'))

кто-то уже писал об этом

http://bulknews.typepad.com/blog/2009/02/json-jquery-and-some-unicode-characters-u2028.html

0 голосов
/ 28 ноября 2009

Возможно, вы захотите попробовать плагин jquery-jsponp, который исправит некоторые проблемы с обработкой jQuery jsonp.

http://code.google.com/p/jquery-jsonp/

Я использую его, и есть много замечательных примеров.

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


Обновление: я сделал удар с jsonp и получаю неожиданные ошибки токена. Не уверен, почему - я могу получить данные вручную с URL-адреса, назначить их переменной JavaScript в консоли, и это нормально.

...