jQuery .getJSON() не анализирует все объекты

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

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

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

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

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


person Brad Westness    schedule 19.05.2010    source источник
comment
Было бы очень полезно, если бы вы разместили образец того, как выглядит ответ.   -  person Pointy    schedule 19.05.2010
comment
Не могли бы вы добавить образец ответа на ваш вопрос, пожалуйста?   -  person pdbartlett    schedule 19.05.2010
comment
Хорошо, я добавил ссылку, чтобы перейти к некоторым результатам JSON из Google Search Appliance. Сначала я думал, что не знаю, хочу ли я публиковать это здесь публично, но потом понял, что это просто данные результатов поиска, которые вы все равно можете получить с веб-сайта университета.   -  person Brad Westness    schedule 19.05.2010
comment
Смотрите мой обновленный ответ - вы не можете ожидать, что он будет работать с несколькими отдельными значениями для R. Это должен быть массив.   -  person Pointy    schedule 19.05.2010


Ответы (2)


Вы можете попробовать сделать "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.

изменить Хорошо, теперь я вижу вашу проблему.

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

  {"GSP": ..., "R":[{"U": ... }, {"U": ... }, {"U": ...}], ...}
person Pointy    schedule 19.05.2010
comment
Что ж, на самом деле я не работаю с JSONP, так как Google Search Appliance не предоставляет возможность выполнять JSONP, поэтому я просто получаю необработанные данные JSON через простой маленький PHP-прокси (обманывая jQuery, заставляя его думать, что это из локальный сервер). Я опубликую пример возвращаемых данных выше. - person Brad Westness; 19.05.2010
comment
А, это имеет смысл. Думаю, я (по глупости) предположил, что проверка JSON с помощью JS Lint/другого валидатора означает, что все в порядке, и мне не нужно было думать, ха-ха. Имеет смысл, что не может быть двух элементов с одним и тем же ключом. - person Brad Westness; 19.05.2010
comment
Что ж, интересно, что валидатор хотя бы не предупредил, так как обнаружить, что это происходит, совсем несложно. - person Pointy; 19.05.2010
comment
Правда, возможно, я напишу ребятам из JS Lint по электронной почте, чтобы сообщить им, что это происходит. - person Brad Westness; 20.05.2010

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

person Alex Winston    schedule 19.05.2010
comment
Если бы он просто использовал eval(), в данном случае это бы совсем не помогло. Ему пришлось бы реализовать специальный анализатор JSON, что вряд ли стоит того. - person Pointy; 19.05.2010
comment
Да, вычисление результирующих данных будет делать то же самое, что и jQuery — он перезапишет каждый элемент R следующим результатом, оставив только один. Я переработал XSLT, чтобы называть каждый элемент R по кардинальному порядку, а не просто называть их R, и теперь он работает правильно. :) - person Brad Westness; 20.05.2010