jQuery .getJSON () не разбирает все объекты - PullRequest
2 голосов
/ 19 мая 2010

Я использую функцию .getJSON jQuery для анализа набора результатов поиска из Google Search Appliance. В Google Search Appliance есть таблица стилей xslt, которая возвращает результаты в виде данных JSON, которые я проверял с помощью JSONLint и JSON Formatter от Curious Concept.

Согласно FireBug, полный набор результатов возвращается из XMLHTTPRequest, но я попытался сбросить данные (с помощью jquery.dump.js), и он анализирует только первый результат. Он успешно получает все содержимое протокола поиска Google, но видит только один объект "R" (или отдельный результат).

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

Edit: Нажав на эту ссылку, вы увидите результаты JSON, возвращенные для поиска по слову "google": http://bigbird.uww.edu/search?client=json_frontend&proxystylesheet=json_frontend&proxyrefresh=1&output=xml_no_dtd&q=google

jQuery извлекает только первый объект "R", даже если все объекты "R" являются братьями и сестрами.

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Вы можете попробовать выполнить getJSON самостоятельно с помощью собственной функции jsonpCallback. Если ответ вызываемого API выглядит как разделенный запятыми список выражений JSON, автоматически созданная функция обратного вызова jQuery увидит только первое.

Другими словами, если API возвращает

{something: "foo", whatever:23}, {something: "bar", whatever, 32}

то, что закончится в блоке скрипта ответа:

magicJqueryCallback({something: "foo", whatever:23}, {something: "bar", whatever, 32})

Обратный вызов jQuery объявляется как имеющий только один аргумент, который он назначает элементу «data» поддельного объекта XHR.

В качестве альтернативы, если у вас есть контроль над тем, что делает код XSLT, вы можете заключить список ответов в набор квадратных скобок, прежде чем он попадет в jQuery:

[{something: "foo", whatever:23}, {something: "bar", whatever, 32}]

Если бы ваш XSLT произвел это, он (я надеюсь) прекрасно работал бы с getJSON.

edit ОК, теперь я вижу вашу проблему.

Ваш ответ JSON содержит несколько значений для «R» внутри внешнего объекта. Это не сработает: если «R» - это список, он должен иметь значение single , причем это значение является массивом.

  {"GSP": ..., "R":[{"U": ... }, {"U": ... }, {"U": ...}], ...}
0 голосов
/ 19 мая 2010

В качестве альтернативы вы всегда можете просто использовать функцию $ .ajax, а затем просто проверить полученный JSON. Я понимаю, что это обычно неуместно, но, поскольку вы можете быть уверены, что Google Search Appliance не будет вводить атаку любого рода, которую можно использовать в этом случае.

...