Статьи

Ajax / jQuery.getJSON Простой пример

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

Что такое JSON?

JSON означает JavaScript Object Notation. Проще говоря, JSON — это способ форматирования данных, например, для его передачи по сети. В этой статье мы рассмотрим загрузку данных JSON с помощью HTTP-запроса GET (мы также можем использовать другие глаголы, такие как POST).

Почему мы выбрали бы JSON, скажем, XML? Основным преимуществом использования JSON является эффективность. JSON менее многословен и загроможден, что приводит к уменьшению количества байтов и ускорению процесса анализа Это позволяет нам обрабатывать больше сообщений, отправленных в формате JSON, чем в формате XML. Более того, JSON имеет очень эффективное и естественное представление объектов, что приводит к таким форматам, как BSON , где JSON-подобные объекты хранятся в двоичном формате.

Теперь давайте посмотрим, как jQuery может помочь нам загрузить данные в JSON-коде из удаленного источника. Для нетерпеливых среди вас есть демоверсия к концу статьи.

JSON jQuery Синтаксис

Метод $.getJSON() — это удобный помощник для работы с JSON напрямую, если вам не требуется много дополнительных настроек. По сути, это сводится к более общему помощнику $ .ajax () с неявным использованием правильных опций. Подпись метода:

 $.getJSON(url, data, success); 

Помимо обязательного параметра URL мы можем передать два необязательных параметра. Один представляет данные для отправки на сервер, другой — обратный вызов для запуска в случае успешного ответа.

Таким образом, три параметра соответствуют:

  1. Параметр url — это строка, содержащая URL, на который отправляется запрос.
  2. Необязательный параметр data — это либо объект, либо строка, которая отправляется на сервер вместе с запросом.
  3. Необязательный параметр success(data, textStatus, jqXHR) является функцией обратного вызова, выполняемой только в случае success(data, textStatus, jqXHR) выполнения запроса.

В простейшем случае мы заботимся только о возвращенном объекте. В этом случае потенциальный обратный вызов success будет выглядеть так:

 function success(data) { // do something with data, which is an object } 

Как уже упоминалось, тот же запрос может быть вызван более подробным $.ajax() . Здесь мы будем использовать:

 $.ajax({ dataType: 'json', url: url, data: data, success: success }); 

Давайте посмотрим на это на практике, используя небольшое демо.

Образец заявки

Мы запустим локальный сервер, который обслуживает статический файл JSON. Объект, представленный этим файлом, будет выбран и обработан нашим кодом JavaScript. В целях нашей демонстрации мы будем использовать Node.js для предоставления сервера (хотя подойдет любой сервер). Это означает, что нам понадобятся следующие три вещи:

  1. Рабочая установка Node.js.
  2. Диспетчер пакетов узла (npm).
  3. Глобальная установка пакета http-сервера .

Первые два пункта зависят от платформы. Если вам нужна помощь в настройке любого из них, вы можете обратиться к нашему руководству: Руководство для начинающих по npm — менеджер пакетов Node или страница загрузки Node (npm поставляется в комплекте с Node).

Третий момент можно достичь, запустив следующее из своего терминала:

 npm install http-server -g 

Если вам требуется префикс sudo (-nix systems) или командная строка с повышенными привилегиями для выполнения этой глобальной установки, вам следует рассмотреть возможность изменения местоположения глобальных пакетов .

После выполнения этих требований мы можем поместить следующие три файла в новую папку:

  1. example.js — это файл JavaScript для запроса данных.
  2. example.json — это пример файла JSON для представления нашего объекта.
  3. index.html — это HTML-страница для вызова JavaScript и отображения данных.

Из командной строки мы можем просто вызвать http-server в новой папке. Теперь http: // localhost: 8080 должен запустить демо.

Образец JavaScript

Следующий код является полной логикой на стороне клиента. Он ожидает загруженного события DOMContentLoaded перед тем, как присоединить обработчик события к событию click элемента с идентификатором get-data . При щелчке по этому элементу мы пытаемся загрузить JSON с сервера, используя $.getJSON() , перед обработкой ответа и его отображением на экране.

 $(document).ready(function () { $('#get-data').click(function () { var showData = $('#show-data'); $.getJSON('example.json', function (data) { console.log(data); var items = data.items.map(function (item) { return item.key + ': ' + item.value; }); showData.empty(); if (items.length) { var content = '<li>' + items.join('</li><li>') + '</li>'; var list = $('<ul />').html(content); showData.append(list); } }); showData.text('Loading the JSON file.'); }); }); 

Помимо преобразования частей объекта в неупорядоченный список, полный объект также печатается в консоли отладки браузера. Выходные данные генерируются в элементе <div> с идентификатором show-data . Даже если элемент сбрасывается для каждого запроса, мы заполняем его только в том случае, если результирующий объект JSON вообще содержит какие-либо элементы. Конечно, для нашего примера данные являются фиксированными, однако в целом возможен любой ответ.

Обратите внимание, что мы также установили некоторый текст для вывода <div> . Если мы вставим некоторую (искусственную) задержку для извлечения JSON, мы увидим, что это фактически выполняется до того, как отобразится какой-либо результат запроса $.getJSON . Причина проста: по умолчанию $.getJSON является неблокирующим, то есть асинхронным. Поэтому обратный вызов будет выполнен в некоторый (неизвестный) более поздний момент времени.

Дистилляция источника для получения важной информации дает следующий блок:

 $('#get-data').click(function () { $.getJSON('example.json', function (data) { console.log(data); }); }); 

Здесь мы только связываем ссылку для запуска запуска помощника $.getJSON перед печатью возвращенного объекта в консоли отладки.

Образец JSON

Пример файла JSON намного больше, чем подмножество, о котором мы заботимся. Тем не менее, образец был построен таким образом, чтобы показать большую часть грамматики JSON. Файл читает:

 { "items": [ { "key": "First", "value": 100 },{ "key": "Second", "value": false },{ "key": "Last", "value": "Mixed" } ], "obj": { "number": 1.2345e-6, "enabled": true }, "message": "Strings have to be in double-quotes." } 

В примере JavaScript мы используем только массив, связанный с ключом items . В отличие от обычного JavaScript, JSON требует от нас помещать ключи в двойные кавычки. Кроме того, мы не можем использовать запятые для указания объектов или массивов. Однако, как и в случае обычных массивов JavaScript, нам разрешено вставлять объекты разных типов.

Образец веб-страницы

Мы уже рассмотрели скрипт и пример файла JSON. Все, что осталось, — это веб-страница, которая предоставляет части, используемые файлом JavaScript для запуска и отображения файла JSON.

 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Request JSON Test</title> </head> <body> <a href="#" id="get-data">Get JSON data</a> <div id="show-data"></div> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <script src="example.js"></script> </body> </html> 

Здесь особо нечего сказать. Мы используем уменьшенную версию jQuery (старая версия 1.9.1, которая, безусловно, достаточна для наших целей) с официальной веб-страницы. Затем мы включаем наш скрипт, который отвечает за внедрение логики.

Примечание . Поскольку мы включаем наши файлы JavaScript в правильном месте (непосредственно перед закрывающим </body> ), больше нет необходимости использовать обратный вызов $(document).ready() , поскольку на этом этапе документ будет готов по определению.

демонстрация

И это то, чем мы заканчиваем.

Более общий метод

Как уже упоминалось, метод $.ajax является реальным предложением для любого (не только связанного с JSON) веб-запроса. Этот метод позволяет нам явно установить все параметры, которые нас интересуют. Мы можем настроить async на true если мы хотим, чтобы этот вызов выполнялся одновременно, т. Е. Запуск выполнялся одновременно с другим кодом. Установка его в false предотвратит запуск другого кода во время загрузки.

 $.ajax({ type: 'GET', url: filename, data: data, async: false, beforeSend: function (xhr) { if (xhr && xhr.overrideMimeType) { xhr.overrideMimeType('application/json;charset=utf-8'); } }, dataType: 'json', success: function (data) { //Do stuff with the JSON data } }); 

Метод overrideMimeType (который переопределяет тип MIME, возвращаемый сервером) вызывается только для демонстрационных целей. Как правило, jQuery достаточно умен, чтобы настроить MIME-тип в соответствии с используемым типом данных.

Прежде чем мы перейдем к введению концепции проверки JSON, давайте кратко рассмотрим более реалистичный пример. Обычно мы не запрашиваем статический файл JSON, но загружаем JSON, который генерируется динамически (например, в результате вызова API). Генерация JSON зависит от некоторых параметров, которые должны быть предоставлены заранее.

 var url = 'https://api.github.com/v1/...'; var data = { q: 'search', text: 'my text' }; $.getJSON(url, data, function (data, status) { if (status === 200) { //Do stuff with the JSON data } }); 

Здесь мы проверяем состояние, чтобы убедиться, что результатом действительно является объект, возвращенный из успешного запроса, а не какой-либо объект, содержащий сообщение об ошибке. Точный код состояния зависит от API, однако для большинства запросов GET обычно используется код состояния 200.

Данные предоставляются в форме объекта, что оставляет задачу создания строки запроса (или передачи тела запроса) до jQuery. Это самый лучший и самый надежный вариант.

Проверка JSON

Мы не должны забывать проверять наши данные JSON! Существует онлайновый инструмент JSON Validator под названием JSONLint , который можно использовать для проверки файлов JSON. В отличие от JavaScript, JSON очень строг и не имеет допусков, например, вышеупомянутые запятые или несколько способов написания ключей (с / , без кавычек).

Итак, давайте обсудим некоторые из наиболее распространенных ошибок при работе с JSON.

Распространенные ошибки в $ .getJSON

  • Тихие сбои при вызовах $.getJSON : это может произойти, если, например, был использован jsoncallback=json1234 , а функция json1234() не существует. В таких случаях $.getJSON автоматически выдаст ошибку. Поэтому мы всегда должны использовать jsoncallback=? позволить jQuery автоматически обрабатывать начальный обратный вызов.
  • В лучшем случае используется реальный JSON (вместо JSONP ) (либо общаясь с нашим собственным сервером, либо через CORS). Это исключает ряд ошибок, которые могут возникнуть при использовании JSONP. Важный вопрос: поддерживает ли сервер / API JSONP? Есть ли какие-либо ограничения на использование JSONP?
  • Uncaught syntax error: Unexpected token (в Chrome) или invalid label (в Firefox). Последнее можно исправить, передав данные JSON в обратный вызов JavaScript. В целом, однако, это сильный индикатор того, что JSON искажен. Попробуйте использовать JSONLint, как указано выше.

Большой вопрос сейчас: как мы можем определить, действительно ли ошибка лежит в переданном JSON?

Как исправить ошибки JSON

Перед началом любой отладки, связанной с JSON, необходимо рассмотреть три важных момента:

  • Мы должны убедиться, что JSON, возвращаемый сервером, имеет правильный формат с правильным MIME-типом.
  • Мы можем попытаться использовать $ .get вместо $.getJSON поскольку наш сервер может возвращать неверный JSON. Также, если JSON.parse() завершается с ошибкой в ​​возвращаемом тексте, мы сразу же узнаем, что виноват JSON.
  • Мы можем проверить возвращаемые данные, зарегистрировав их на консоли. Это должно быть входом для дальнейших исследований.

Отладка должна начинаться с ранее упомянутого инструмента JSONLint.

Вывод

JSON — это стандартный формат де-факто для обмена текстовыми данными. Метод $.getJSON() jQuery дает нам небольшой помощник для решения практически любого сценария, связанного с запросом данных в формате JSON. В этой статье мы исследовали некоторые методы и возможности, которые идут с этим удобным помощником.

Есть ли другие лучшие практики для $.getJSON() вы не можете жить?