$ .getJSON завершается с ошибкой разбора - PullRequest
0 голосов
/ 29 июля 2010

Я пытаюсь использовать jQuery.getJSON для получения данных из домена, который мне не принадлежит.Я заставил это работать в прошлом, но на этот раз это терпит неудачу.Я получаю ответ в браузере, но затем Chrome говорит SyntaxError: Unexpected token :, а Firefox говорит invalid label.

В этом есть несколько особенностей.Скажем, код MY_JSON_RESPONSE (не переменная, просто псевдоним).Они оба возвращают ожидаемые объекты:

a = MY_JSON_RESPONSE;
eval(MY_JSON_RESPONSE);

Это мой запрос:

$.getJSON("http://xxx.yyy.zzz/abc?callback=?",
   function(data) {
     console.log(data);
   });

РЕДАКТИРОВАТЬ: Ниже приведены анонимные данные ответа:

{"aaaaaaa":"aaaaaaaa aaaaa aaa aaaaaaaaaa","aaaaa":"aaaaaaaa aaaaa aaa","aa":"0000000","aaaa_aaaaaaa":"aaa aaaaa","aaaaaaa_aaaaaaa":"aa aaa aaaaaaaa aa aaaaaaaa aaa aaaaaaa aaaaaa aaa aaa aaaaaaaa aa aaaaaaaa aa aaaaaa aaaaa aaa aaaaa. aaa aaaaaaaa aaaaa aaa aaaaaaaaaa aaaaaaaa aaaaa aaaaa aaaaaaaa aaaaaaaaaaa aaaaaaaaaa aa aaaa 00 aaaaaaa aaaaaaaaa aa aaa aaaaaaaa aaaaa aaa, aa aaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaa, aaaaaaaaa aaa aaaaaaa aaaaaaaa. 00% aa aaaaaaa aaaaaa aaaaa aaaaa aaaaaaaaaaaaa aaaaa aaaaaaaaaaaaa.","aaaaaaaaa":[{"aaaaaa":"aaaaa aaa aaaaaa  aaaaaaaa","aaaaaaa":"aaaaaaaa aa aaaaaa aaa aaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaa","aaaaaaa":"aaaaaaaa aaaa aa &aaaa;aaaaa aaa aaaaaaaaaa aaaaaaaaa&aaaa; - aaa aaa aa, aaaaa aaa a aaaa aaaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a000.00"},{"aaaaaa":"aaaaa","aaaaaaa":"aaaa aaaa aaaa!!!!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaa\/aaa","aaaaaaa":"aaaaaaa aaaaa aaaa aaa aaaa aaaaa aaa aaaaa aaa aaaaaaa aaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aa (aaaaaaa &aaa; aaaaaaaaa)","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a0000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa  aaaaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaaaaa aaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaa","aaaaaaa":"aaaa aaaaaaa aaaaaaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaaaaa","aaaaaaa":"aaaaa aaaaaa�a aaa, aaa! aaaa aaaaaaaa aa aaa aaa! :-) --aaa","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaa - aaaaaaaa aaaaaa aaa","aaaaaaa":"aaaaaa aa aaa aaa aaaaaaaa aaaaa aaaaaa aa aaaa aa aaa aaaaa aaa aaaaa. aaaa aaaa aaaaaa aaaaaaaaa !!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaa aaaaaaaaa","aaaaaaa":"aa aaaaaa aaaa aaaaaaaa aa aaaa aa aaaa aa a aaaa aaaaa aaa aaaaaaaaaa. aaaa aa aa aaaaaa aa a aaaa aaaaa.","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaaaa aaa aaaaaaaaaaa aaaaaaa aaaaaa","aaaaaaa":"aaaaa aaaaa. aaaa aa aaa aaaaaa aaaaaaaaa!!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa  aaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaaaaaaaa aaaaaa","aaaaaaa":"aaaaaaa aaa aaaa aaaaaa�a aaaaaaaaa aaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a0000.00","aaaa_aaa":"\u00a000.00"},{"aaaaaa":"aaaaaaa aaaaaa","aaaaaaa":"aaaaaaaaa aaaaa, aaa! aaaaaaa &aaa; aaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"},{"aaaaaa":"aaaaa aaaaaaaa","aaaaaaa":"aaaaaaaa aaaaaaa - aaaaaaa aaaaaaaaa a aaa aaa aaaaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaa","aaaaaaa":"aaaaaaaaaaaa - aaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a0000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaaaaaaa","aaaaaaa":"aaaa aaaa!!!","aaaa":"00\/00\/00","aaaaaa":"\u00a00.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaaa","aaaaaaa":"aaaa aaaa aaaaa, aaaaaaa, aaaaaaa, aaaaa, aaa, aaaa, aaa, aaaaaaaa, aaaa, aaa, aaaaa, aaa, aaa, aaaaa, aaa, aaaa, aaaa, aaaa, aaaaa, aaa, aaaaaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaaa aaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaa aaaaaa","aaaaaaa":"aaaa aaa aa aa aaaa aa a aaaaaaa aa aaaaa! aaa aaa aaaaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaaaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaa","aaaaaaa":"aa aa aa! :)","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaa aaaaaaaaa","aaaaaaa":"aaaa a aaaaaa aaaaaaaaa aaaa aa aa aaa :)","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaa-aaaaaaa aaaaaaaa","aaaaaaa":"aaaa aaaaaaaa aa aa aaa aaaa aa aa aaaaaaaaaaa, aaaa a. aaaaaaaa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaa","aaaaaaa":"","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaa","aaaaaaa":"a aaaaaaaa aa aaa aaaaaaaa aaaaa aaa aa aaaaa aa aaaaa aaa aaaaa aaaaa  aa aaa aaaaaa aa aaaaaaaaa.","aaaa":"00\/00\/00","aaaaaa":"","aaaa_aaa":""},{"aaaaaa":"aaaaaaa aaaaaaa","aaaaaaa":"aaaaa aaaaaaaa aaa aaaa aaaaaaa aaaa aaaaaa aaa!","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":""},{"aaaaaa":"aaa aaaa","aaaaaaa":"aaaa aaaa aaaa aaaa aaaaaaaaaaa aaaa aaa aaa aaaaaaaaa aaaa aaa aa","aaaa":"00\/00\/00","aaaaaa":"\u00a000.00","aaaa_aaa":"\u00a00.00"}],"aaaa_aaaaaaa":"","aaaa_aaa":"\u00a0000.00","aaaaaaaaa_aaaaaa":"\u00a00,000.00","aaaaaaaaa_aaaaa":"\u00a00,000.00","aaaaaaa_aaaa":"aaaa:\/\/aaa.aaaaaaaaaa.aaa\/\/aaaaa\/aaaaaaa.aaaa?aaaa=aaaaaaa&aaaaaaaaa=aaaaaaaaaaa&aaaaa=000&aaaaaa=000&aaa=aaaa_aaaa0.aaa","aaaaaaaaa_aaaaaa":"\u00a00,000.00","aaaaaaaaa_aaaaaaa":"\u00a00.00","aaa_aaaaaa":true,"aaaaaaaaaa_aaaaaaaa":00}

Я бы хотел избежать необходимости делать это на сервере в своем домене, чтобы минимизировать нагрузку на сервер.

Ответы [ 4 ]

1 голос
/ 29 июля 2010

Разбор JSON в jQuery 1.4 более строг, чем в предыдущих версиях. В зависимости от вашего браузера, он может использовать собственный разбор JSON, который отличается от eval. Одно большое отличие состоит в том, что теперь все ключи ДОЛЖНЫ быть заключены в двойные кавычки, а не в одинарные. Как вы сказали, eval сделает это без ошибок, поскольку JS вообще не строго указывает имена свойств, но не сможет выполнить синтаксический анализ JSON.

У меня была проблема с этим при преобразовании проекта в jq 1.4, так как у меня был какой-то старый код, который создавал строки json вручную. Например

return "{'a':12}";  // fails parsing due to single quotes

Гораздо лучше использовать встроенные библиотеки json:

return '{"a":12}'; // works
return json_encode(array('a'=>12)); // preferred!
return json.dumps({'a':12}) # etc.

, поскольку они всегда производят действительный JSON.

0 голосов
/ 14 марта 2014

Я тоже сейчас сталкиваюсь с той же проблемой, мой сервер отвечает правильными данными json. Я следовал тому же шаблону кода, который вы использовали. Я сделал R & D на это, прежде чем комментировать здесь, чтобы устранить эту ошибку. Как мы использовали "callback =?" в URL он запрашивает объект как JSONP. Предполагается, что ответ приходит в формате JSONP, но ответ приходит в чистом формате JSON. Получив ответ, он пытается выполнить синтаксический анализ по JSONP, а не по JSON. Пожалуйста, подтвердите, если я ошибаюсь, также дайте мне знать, если ваша проблема решена или нет. Спасибо.

0 голосов
/ 30 июля 2010

Интересно, что согласно http://jsonformatter.curiousconcept.com/ этот JSON действителен.

Как уже отмечали другие ... jQuery 1.4 не будет принимать искаженный JSON, однако, более ранние версии будут (если вы хотите по какой-то сумасшедшей причине идти в направлении.)

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

Пример: API tumblr (движок блога) ... по какой-то причине они использовали ... "-" ... так что для "тела" поста блога у них есть "обычный" "тело" ... которое jQuery явно ненавидит со страстью.

Вы могли бы подумать, что могли бы сделать ...

json.posts[2].regular-body

Но это будет ошибка, так что вам нужно [] ...

json.posts[2]['regular-body']

Итак ...

Если вы можете более подробно рассказать о том, как вы вызываете данные JSON elements , это может быть полезно?

0 голосов
/ 30 июля 2010

Образец JSON недействителен. Включает эту подстроку:

}, {

То есть, он заканчивает один объект и запускает другой. Таким образом, он выглядит как массив объектов, за исключением заключенных в квадратные скобки.

Редактировать: моя ошибка! На самом деле в нем есть вложенный массив. Может быть, вы должны «хорошенько напечатать» его при создании, чтобы было легче увидеть, в чем проблема?

...