JSON – самый популярный на текущий момент формат передачи данных. Расшифровывается он как JavaScript Object Notation, но не бойтесь – для того, чтобы с ним работать, основы программирования JavaScript знать не нужно, JSON самодостаточен. Ниже – о том, зачем он нужен, как выглядит, где используется и какие у него есть альтернативы.
JSON – это язык записи объектов в текстовом формате. Если вы знакомы с ООП, то вы знаете, что существуют объекты – структуры, которые содержат в себе информацию (поля и методы). Приложения манипулируют объектами для того, чтобы что-то делать, и пока объект (JavaScript или любого другого языка с поддержкой ООП) находится внутри приложения, никаких проблем нет – модифицируем поля, вызываем методы, радуемся жизни. Но что делать, если нужно передать объект куда-то еще, например – от сервера к браузеру? Тут внезапно оказывается, что объект на сервере – это бинарный код, и «просто скинуть нужный файлик» не получится.
Проблему решают с помощью сериализации/десериализации. Сериализация – процесс перевода объекта в другой формат, обычно – битовая последовательность или текст. Обычно разработчикам интересны конкретно поля объекта, поэтому они и сериализуются – просто берут поле «name», например, и записывают это поле со значением в текстовый файлик, после чего посылают этот файлик в точку назначения (на сервер, например). В точке назначения происходит десериализация – на основе данных из файлика создается объект с полем «name» и указанным значением.
Существует множество вариантов сериализации, но наиболее популярным форматом сейчас является JSON – язык, который изначально был подмножеством JavaScript, но затем полностью «отпочковался» от синтаксиса JavaScript и стал самостоятельным языком описания объектов. Частично он стал популярным из-за популярности – JS: технология AJAX, существенно расширившая возможности фронтенда, опирается на JSON. Но JSON и сам по себе оказался очень успешной реализацией сериализации – в сравнении с XML Schema, например, JSON намного проще читается и существенно меньше весит за счет отсутствия дублирующих тегов и отсутствия информации о структуре объекта.
Если кратко – везде. Этот формат обмена данными прижился настолько, что вы встретите его и в REST API, и во внутренних модулях крупных приложений, и в пет-проектах. Методы parse() для JSON есть в любом более-менее популярном языке программирования, то есть у вас не будет проблем с тем, чтобы запаковать/распаковать объект в формате JSON – за вас все сделают встроенные инструменты. Вот – основные области, в которых вы будете сталкиваться с JSON чаще всего:
Вот вам JSON для примера:
{
“user”: “admin”,
“password”: “admin123”
}
Собственно, мы показали практически все, что вам нужно знать. В JSON каждый объект начинается с «{» и заканчивается «}»; все данные имеют вид «ключ:значение»; пары разделяются запятой. После последней пары «ключ:значение» запятая не ставится, запомните это. В JSON ключ – это всегда строка, поэтому ключ должен помещаться в двойные кавычки. Пара «ключ:значение» – это поле объекта, ключ – это имя поля (переменной), значение – это то, что хранилось в переменной.
Из важных технических деталей – JSON является неупорядоченным форматом, то есть язык не гарантирует вам, что описанные поля будут идти в таком же порядке, в котором они шли в объекте. Кроме того, JSON требует, чтобы декодеры (приложения, которые из пакета собирают объект) принимали именно неупорядоченный набор полей: если декодер валится с ошибкой из-за неправильного порядка полей, то это – баг, который нужно исправлять.
Единственная важная вещь, о которой мы еще не рассказали – типы переменных (значений), которые могут храниться в JSON. Всего их – 6:
Вот – пример, в котором есть все:
{
"name": "example", //строка
"isActive": true, //булево значение
"age": 30, //число
"address": null, //null
"skills": ["JavaScript", "SQL", "Python"], //массив
"details": { //объект
"position": "Developer",
"experience": 5
}
}
Кстати, все пробелы и знаки табуляции внутри примера выше добавлены для вашего удобства, JSON не учитывает пробельные символы – все это можно записать в одну строчку при необходимости (для оптимизации веса именно так и делают). Комментарии тоже добавлены для вашего удобства – в JSON комментарии не предусмотрены.
JSON вырос на JavaScript, а JS – язык, мягко скажем, фривольный, поэтому составлять JSON-файл можно и по другим правилам – не указывать названия ключей, например, парсер JS все равно «съест» эти данные (другие языки могут ругаться). Но если каждый будет сам придумывать свои правила для описания объектов, то передача информации очень быстро превратится в кашу с сотнями стандартов. Чтобы не допустить этого, «комитет по интернету» выделил 4 правила, которые составляют «правильный», или «well-formed» JSON:
Наши примеры выше соответствуют всем этим рекомендациям, и мы не советуем вам отходить от них в вашей работе.
Для того, чтобы проверить свой JSON на «правильность», вы можете использовать людей из валидаторов JSON – они без труда гуглятся. Как пример – JSONlint.
Стандартный JSON – крайне простая технология, и для некоторых проектов это является минусом: не хватает инструментов. Самостоятельно переделывать формат – плохая идея, поскольку приложение перестанет быть RESTful, но обходной путь все же есть – в виде «общепризнанных» технологий, расширяющих базовый формат. Наиболее популярные решения здесь – JSON5 и JSON Schema.
JSON5 – это официальное расширение. Основные изменения:
Но учтите, что JSON5 пока еще поддерживают далеко не все сервисы и языки – если вы скормите JSON5-конфигурацию приложению, которое ожидает обычный JSON, у вас могут быть проблемы.
JSOSN Schema – это отдельный язык, который является надстройкой над базовым JSON и расширяет его, убирая типы данных, флаги обязательных полей и другие инструменты, которые делают обмен информации более строгим и стандартизированным. К примеру – вот так выглядит JSON с адресом:
{
"name": "Иван Иванов",
"age": 30,
"email": "[email protected]",
"address": {
"street": "ул. Ленина",
"city": "Минск",
"postalCode": "220000"
}
}
А вот так выглядит JSON Schema, описывающая правила ввода адреса:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer",
"minimum": 18
},
"email": {
"type": "string",
"format": "email"
},
"address": {
"type": "object",
"properties": {
"street": {
"type": "string"
},
"city": {
"type": "string"
},
"postalCode": {
"type": "string",
"pattern": "^[0-9]{6}$"
}
},
"required": ["street", "city", "postalCode"]
}
},
"required": ["name", "age", "email", "address"]
}
Здесь появились типы, ограничения и обязательные/необязательные поля – теперь многие проверки можно делать на стороне клиента, не посылая лишние запросы на сервер. Но и текста стало намного больше – для высоконагруженных проектов это может стать критическим минусом.
JSON стал популярным по ряду причин:
Именно поэтому JSON в свое время выбрали языком передачи данных для REST API – альтернативой ему был XML, и XML существенно проигрывал (и проигрывает) JSONу по легковесности из-за большого количества лишней информации. Сейчас эта проблема никуда не делась, дополнительно – REST API доминирует на рынке, поэтому если у вас нет четких аргументов в пользу XML – лучше выбирать JSON.
Что касается YAML – JSON является частным случаем YAML, поэтому технически последний можно использовать вместо JSON. Проблема здесь – в том, что YAML имеет функции, которые вам, скорее всего, не пригодятся, плюс к этому – REST API не построен на YAML. Поэтому JSON все еще предпочтительнее.