с jQuery, доступ json от перекрестного доменного URL, где json может быть плохо сформирован

>>> import traceback
>>> def x():
>>>    print traceback.extract_stack()

>>> x()
[('', 1, '', None), ('', 2, 'x', None)]

можно также приятно отформатировать отслеживание стека, видеть эти документы .

Редактирование : Для моделирования поведения Java, как предложено @Douglas Leeder, добавляет, это:

import signal
import traceback

signal.signal(signal.SIGUSR1, lambda sig, stack: traceback.print_stack(stack))

к запуску кодируют в Вашем приложении. Тогда можно распечатать стек путем отправки SIGUSR1 к рабочему процессу Python.

5
задан Matt Howell 28 November 2009 в 04:37
поделиться

5 ответов

Проблема заключается в службе JSONP, она полностью отклоняет параметр обратного вызова .

Ответ JSONP - это просто функция вызов с использованием обратного вызова получить параметр в качестве имени функции:

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

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

Будет возвращено:

myCallback({/*json*/});

В то время как тот , который вы публикуете , возвращает простой действительный JSON, но его нельзя обрабатывать как Ответ JSONP .

3
ответ дан 15 December 2019 в 01:03
поделиться

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

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

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


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


Изменить: прогнать это через мой синтаксический анализатор на основе C ++. Изначально не брал,

1
ответ дан 15 December 2019 в 01:03
поделиться

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

я обнаружил следующее:

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

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

\ 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
ответ дан 15 December 2019 в 01:03
поделиться

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

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

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

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


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

0
ответ дан 15 December 2019 в 01:03
поделиться

I don't appear to be any closer to a client side solution. I changed the code to use jQuery-jsonp. It now looks like this:

$(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's console log displays:

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

For whatever reason, the json parse in my Firefox browser (FF v3.0.15, Linux Ubuntu 9.0.4) is throwing the "unterminated string literal" exception. I know if I remove the '& q u o t' strings and two characters in the 'Maintainable ASP.NET MVC' block then the json will parse successfully. Since I have no control on the server side, is there any thing I can do with client-side javascript that will eventually get the server's json string, as-is, into a client side json object. I thought the dataFilter property for jsonp was set up exactly for that purpose, to intercept the json and 'scrub' it. However, that function in my code is not called, quite possibly because the json that is passed into the dataFilterFunc function will not parse successfully.

0
ответ дан 15 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: