JSON – текстовый формат информации, разработанный на основе JavaScript, но независимый от него, цель которого – обмен данными между различными приложениями или даже языками программирования. Применяется практически во всех крупных проектах, особенно на сайтах, использующих технологию Ajax. Совместим со многими языками программирования.
Применение JSON
JSON можно вставлять везде, где требуется передача данных между программами. Также его применяют для временного локального хранения информации (например, настроек). Успешно обрабатывают PYTHON, C++, C# и многие другие языки. Наиболее часто применяется для пересылки информации между браузером и сервером (подгрузка контента технологией Ajax) или между веб-сайтами (различные HTTP-соединения).
Пример проблемы, которую решает
Распространённая задача – динамическая подгрузка контента из PHP файла и базы данных без обновления страниц. Например, когда пользователь прокручивает страницу вниз при просмотре фотоальбома, каталога товаров или других данных. Когда он доходит до низа страницы, включается JavaScript код, который отправляет с помощью технологии Ajax запрос на сервер (на PHP файл). Запрос обрабатывается PHP и отправляется JSON ответ обратно.
С помощью такого приёма браузер и сервер могут обмениваться информацией и, доставая данные с сервера (что делает PHP), менять содержимое страницы без её перезагрузки (что умеет JavaScript). Но тут есть одна проблема – дело в том, что PHP и JavaScript являются разными языками, а значит, обмен массивами и объектами невозможен. На помощь приходит JSON формат, который является универсальным и связующим звеном.
Синтаксис кода
Ответ в закодированной форме может иметь вид:
- Группы пар: «ключ: значение». Этот вид может создаваться через ассоциативный массив, списки с ключом, текст, словарь, хеш-таблицу – в каждом языке данный вариант представлен по-своему. Ключ JSON обязательно является строкой (тип переменной), часто зависимой от регистра (когда заглавная «А» и обычная «а» являются разными символами). Значение может иметь любой тип (строка, число и другие).
- Набор значений, обладающий некоторой упорядоченностью. Обычно имеет вид массива, последовательности, списка, вектора.
Формат совместим со всеми распространёнными языками программирования. Именно поэтому он может применяться для обмена ответами между различными ПО и СО.
Значениями способны выступать:
- Число (но обязательно целое).
- Число с плавающей точкой (десятичное дробное).
- Булевское значение – логический ответ, правда (true) или ложь (false).
- Объект – это различные пары, имеющие вид «ключ: значение», которые при этом не упорядочены. JSON объект ставится в фигурные скобки. Ключ всегда является строкой, а после неё (перед значением) ставят двоеточие. Данные пары разделяются запятыми.
- Массив (только не многомерный) является упорядоченным набором значений. Он ставится в квадратные скобки. Ответ иногда бывает пустым. Между значениями (если их несколько) ставятся запятые.
Ниже приведён пример использования всех вариантов значений для JSON сообщения на сайте:
{
«userData»: { // объект
«name»: «Сергей», // типичная пара – «ключ: значение»
«middleName»: «Александрович»,
«surname»: «Воробьёв»,
«contacts»: [ // значением в паре может быть и JSON массив
«84959000000», // это строка, а не число, о чём подробнее сказано ниже
«sergey.vorobey@mail.ru»
],
«registrationDate»: «18.01.2020»,
«status»: «Новичок»,
«authorization»: true // булевское значение ставится без кавычек
}, // один объект может находиться внутри другого JSON объекта. В этом случае вложенный объект или массив ставится в виде обычного значения
«message»: {
«topic»: «День Дурака»,
«dateReview»: «01.04.2020»,
«comment»: «Поздравляю всех с днём дурака»,
«commentRating»: 26, // число ставится без кавычек
«assessments»: 28 // обратите внимание, что в JSON объектах и массивах после последнего элемента запятая не ставится
}
}
Надо обратить внимание на значение «84959000000», которое является номером телефона. Это не число, а именно строка, несмотря на то, что она целиком состоит из цифр. Дело в том, что JSON строка в данном случае – это тип переменной, над которой нельзя выполнять математических действий, но можно производить различные строковые операции (подсчёт количества символов и другие).
Совсем не обязательно представлять запись таким развёрнутым образом. Лишние пробелы и переносы строк увеличивают объём передаваемых данных, поэтому от них лучше избавляться. Так как этот формат текстовый, то записать JSON лучше в одну строку.
Та же система на языке XML строится так:
<user>
<userData>
<name>Сергей</name>
<middleName>Александрович</middleName>
<surname>Воробьёв</surname>
<contacts>
<contact>84959825825</contact>
<contact>sergey.vorobey@mail.ru</contact>
</contacts>
<registrationDate>18.01.2020</registrationDate>
<status>Новичок</status>
<authorization>1</authorization>
</userData>
<message>
<topic>День Дурака</topic>
<dateReview>01.04.2020</dateReview>
<comment>Поздравляю всех с днём дурака</comment>
<commentRating>26</commentRating>
<assessments>28</assessments>
</message>
</user>
Или следующим образом:
<userData name=»Сергей» middleName=»Александрович» surname=»Воробьёв» />
<contacts>
<contact>84959000000</contact>
<contact>sergey.vorobey@mail.ru</contact>
</contacts>
<person registrationDate=»18.01.2020″ status=»Новичок» authorization=»1″ />
<message topic=»День Дурака» dateReview=»01.04.2020″>
<comment>Поздравляю всех с днём дурака</comment>
</message>
<rating commentRating=»26″ assessments=»28″ />
</user>
JSON5
Последнее расширение JSON формата сделало его более функциональным. Как и прежде оно полностью соответствует синтаксису ECMAScript5. Кроме того, JSON5 совместим с обычной версией.
Основные новшества расширения:
- можно использовать однострочные и многострочные комментарии (// и /**/);
- в объектах и списках после последней пары можно ставить запятую, что несколько ускоряет кодирование при копировании;
- в JSON объектах можно использовать ключи без кавычек, но только если они валидны;
- строки можно ставить в одинарные и двойные кавычки;
- числовой тип данных может представляться в шестнадцатеричном варианте, перед или после него можно ставить десятичную точку. А также вписывать значения Infinity, -Infinity, NaN, -NaN, но тогда перед этим надо ставить JSON символ «+».
Применение JSON в Ajax
Нижеприведённый пример JavaScript демонстрирует применение команды XMLHttpRequest, которая помогает делать запрос к серверу для получения JSON объекта (код PHP, дающий ответ, намеренно проигнорирован для упрощения примера):
var httpsRequest = new XMLHttpRequest();
httpsRequest.onreadystatechange = function () {
if (httpsRequest.readyState !== 4)
return;
if (httpsRequest.status !== 200)
throw new Error(«ответ не является допустимым ответом JSON«);
do_something_with_object(JSON.parse(httpsRequest.responseText));
httpsRequest = null;
};
httpsRequest.open(«GET», url, true);
httpsRequest.send(null);
Но надо помнить, что вышеописанный пример с использованием встроенной функции XMLHttpRequest даст ошибку JSON, так как не работает в старых браузерах IE до версии 6 включительно. Впрочем, данные типы браузеров настолько редко встречаются, что о них можно не заботиться.
Также надо помнить, что использование XMLHttpRequest ограничено из-за некоторых особенностей работы домена. В частности, страница, посылающая JSON запрос, обязана располагаться на том же DNS-домене, что и файл, дающий ответ. Для разрешения ситуации используется метод JSONP.
Кроме того, в код можно вставлять блоки frame для асинхронного запроса. Альтернативой является элемент, который передаёт на файл PHP JSON в массиве. Данные методы решения проблем с сервером часто использовались до широкого распространения поддержки XMLHttpRequest.