Немного истории
Изначально JSON разрабатывался как формат для обмена данными между клиентом JavaScript и сервером. Он быстро завоевал популярность как легко читаемый для человека формат, который front-end программисты могли использовать для обмена данными с сервером, используя упрощенный, стандартизированный формат. Разработчики также обнаружили, что JSON очень гибок: можно было добавлять, удалять и обновлять поля в произвольном порядке. Эта гибкость была достигнута ценой безопасности, которая была позже решена с помощью JSON Schema.
Любопытным поворотом стало то, что JSON был популяризирован благодаря революции AJAX. Согласитесь, странно, учитывая тогдашний акцент на XML, но именно JSON позволил AJAX по-настоящему засиять. Использование REST в качестве стандарта для разработки API и JSON как средства для обмена оказалось мощной комбинацией для поддержания баланса между простотой, гибкостью и связностью.
В дальнейшем JSON перешел с front-end JavaScript на обмен данными клиент-сервер, а оттуда – на системные конфигурационные файлы, back-end языки и вплоть до баз данных. JSON также послужил толчком для движения NoSQL, которое в корне изменило хранение данных. Оказалось, что администраторам баз данных также понравилась гибкость JSON и простота программирования.
Сегодня документо-ориентированные хранилища, такие как MongoDB, предоставляют API, работающий с JSON-подобными структурами данных. В интервью в начале 2022 года технический директор MongoDB Марк Портер отметил, что, с его точки зрения, JSON все еще раздвигает границы работы с данными. Весьма неплохо как для формата данных, который начинал свой путь со скромной фигурной скобки и двоеточия.
Почему разработчики используют JSON
Независимо от того, над каким типом программы они работают, разработчики программного обеспечения нуждаются в каком-то способе описания и обмена данными. Такая необходимость наблюдается в базах данных, бизнес логике, пользовательских интерфейсах и всех системах обмена данными. Существует множество подходов к структурированию данных для обмена. Два основных лагеря включают двоичные и текстовые данные. JSON – это текстовый формат, поэтому его могут читать как люди, так и компьютеры.
JSON является чрезвычайно успешным способом форматирования данных по нескольким причинам. Во-первых, он является родным для JavaScript и используется внутри программ на JavaScript в виде литералов JSON. Вы также можете использовать JSON с другими языками программирования, поэтому он будет полезным для обмена данными между гетерогенными системами. И, наконец, он является легко читаемым для человека и очень универсальным инструментом для языковой структуры данных. Кроме того, он довольно прост в использовании, особенно по сравнению с другими форматами.
Как работает JSON
При вводе имя пользователя и пароля в форму на веб-странице вы взаимодействуете с объектом, имеющим два поля: имя пользователя и пароль. В качестве примера рассмотрим страницу входа в систему на Рисунке 1.
Обычная страница входа в систему.
Пример №1. Ниже показана эта страница, описанная с помощью JSON. Данные для страницы входа у формате JSON:
{
username: “Bilbo Baggins”,
password: “fkjfdf3fd2jv9dwwf”
}
Все, что находится внутри скобок или волнистых скобок ( {...} ) относится к одному и тому же объекту. Объект, в данном случае, в самом общем смысле слова означает "единую сущность". Внутри скобок находятся свойства, которые принадлежат объекту. Каждое свойство состоит из двух частей: имени и значения, разделенных двоеточием. Они называются ключами и значениями. В примере ниже "имя пользователя" – это ключ, а "Бильбо Бэггинс" – значение.
Свойства, поля и атрибуты
Каждый из этих элементов используется для обозначения частей объекта JSON. С технической точки зрения, в контексте объектно-ориентированного языка программирования, они называются членами. Каждое свойство, поле или атрибут является членом объекта.
Ключевым моментом здесь является то, что JSON делает все необходимое для решения поставленной задачи, в данном случае, хранения информацию в форме без большого количества лишней информации. Вы можете взглянуть на этот JSON-файл и понять его. Вот почему мы говорим, что JSON лаконичен. Лаконичность также делает JSON отличным форматом для передачи по сети.
JSON vs XML
JSON создавался как альтернатива XML, который когда-то был доминирующим форматом для обмена данными. Форма входа в систему в примере №2 описана с помощью XML.
Пример №2. Форма входа в систему в формате XML:
<UserLogin>
<Username>Samwise Gamgee</Username>
<Password>ghB5fK5</Password>
</UserLogin>
Ох! Просто смотреть на эту форму уже утомительно. Представьте, что вам придется создавать и проводить ее синтаксический анализ в коде. В отличие от этого, использование JSON в JavaScript очень просто. Просто попробуйте это сделать. Нажмите F12 в браузере, чтобы открыть консоль JavaScript, затем вставьте JSON, показанный в примере №3.
Пример №3. Использование JSON в JavaScript
let hobbitJson = {
name: "Pippin",
hometown: "Shire"
}
console.log(hobbitJson.name); // outputs “Pippin”
hobbitJson.bestFriend = "Merry"; // modify the object
console.log(JSON.stringify(hobbitJson)); //output entire object
// {"name":"Pippin","hometown":"Shire","bestFriend":"Merry"}
XML трудно читемый и оставляет желать лучшего с точки зрения гибкости разработки. JSON создавался для решения этих проблем. Неудивительно, что он более или менее вытеснил XML.
JSON vs YAML и CSV
Два формата данных, которые иногда сравнивают с JSON, – это YAML и CSV. Эти два формата находятся на противоположных концах временного спектра. CSV – это древний, доцифровой формат, который в конечном итоге нашел применение в компьютерах. YAML вдохновляся форматом JSON и является его концептуальным потомком.
CSV представляет собой простой список значений, каждая запись которого обозначается запятой или другим символом-разделителем, с опциональной первой строкой заголовка. Он довольно ограничен как средство обмена и программная структура, но все же полезен для вывода больших объемов данных на диск. И, конечно, организация табличных данных в CSV идеально подходит для таких вещей, как электронные таблицы.
YAML – это фактически надмножество JSON, то есть он поддерживает все, что поддерживает JSON. Но YAML также поддерживает более упрощенный синтаксис, который еще более лаконичен, чем в JSON. Например, YAML использует отступы для создания иерархии, отказываясь от скобок. Хотя YML иногда используется в качестве формата обмена данными и очень часто задействуется при работе с конфигурационными файлами.
Сложный JSON: вложения, объекты и массивы
Пока вы видели примеры использования JSON только с простыми объектами. Это означает, что каждое поле объекта содержит значение примитивного типа. JSON также способен моделировать произвольные усложненные структуры данных, такие как графовые объекты и циклические графы, то есть структуры с циклическими ссылками. В этом разделе вы увидите примеры сложного моделирования с помощью вложения, объектных ссылок и массивов.
Вложенные объекты в JSON
В примере №4 показано, как определить вложенные объекты JSON. Вложенный JSON:
let merry = { name: "Merry",
bestfriend: {
name: "Pippin"
}
}
Свойство bestfriend в примере №4 ссылается на другой объект, который определен в строке как литерал JSON.
Объектные ссылки в JSON
Теперь рассмотрим пример №5, где вместо имени в свойстве bestfriend используется ссылка на реальный объект.
Пример №5. Ссылка на объект
let merry = { race: "hobbit", name: “Merry Brandybuck” }
let pippin = {race: "hobbit", name: “Pippin Took”, bestfriend: merry }
console.log(JSON.stringify(pippin.bestfriend.name)); // outputs “Merry Brandybuck”
В примере №5 мы поместили ссылку объекта merry в свойство bestfriend. Затем мы можем получить фактический объект merry от объекта pippin через свойство bestfriend. Мы получили имя объекта merry с помощью свойства name. Это называется обходом графа объектов, который выполняется при помощи оператора "." (точка).
Массивы в JSON
Другой тип структуры, которую могут иметь свойства JSON, – это массивы. Они выглядят так же, как массивы JavaScript, и обозначаются квадратной скобкой, как показано в примере №6.
Пример №6. Свойство массива
{
towns: [ “The Shire”, “Rivendale”, “Gondor” ]
}
Конечно, массивы могут содержать ссылки и на другие объекты. С помощью этих двух структур JSON может моделировать любой диапазон сложных отношений между объектами.
Краткое описание значимых типов JSON
Ранее вы уже встречались со строками, объектами и массивами в качестве значимых типов. Дополнительные значимые типы для свойств JSON включают строку, число, объект, массив, true, false и null.
Синтаксический анализ и генерация JSON
Синтаксический анализ и генерация JSON подразумевает считывание и создание JSON, соответственно. Вы уже видели JSON.stringify() в действии. Это встроенный механизм для программ JavaScript, позволяющий взять представление объекта в памяти и превратить его в строку JSON. Чтобы пойти в другом направлении, то есть взять строку JSON и превратить ее в объект в памяти, вы используете JSON.parse().
В большинстве других языков для синтаксического анализа и генерации необходимо использовать сторонние библиотеки. Например, в Java существует множество библиотек, но наиболее популярными являются Jackson и GSON. Эти библиотеки сложнее, чем stringify и parse в JavaScript, но они также предлагают расширенные возможности, такие как маппинг между пользовательскими типами и работу с другими форматами данных.
В JavaScript принято отправлять и получать JSON на серверы. Например, с помощью встроенного API fetch(). При этом можно автоматически проанализировать ответ, как показано в примере №7.
Пример №7. Анализ ответа в формате JSON с помощью функции fetch()
fetch('https://the-one-api.dev/v2/character')
.then((response) => response.json())
.then((data) => console.log(data));
Как только вы превратите JSON в структуру данных в памяти, будь то JavaScript или другой язык, вы можете использовать API для манипулирования этой структурой. Например, в JavaScript к JSON, проанализированному в примере №7, можно было бы обращаться как к любому другому объекту JavaScript, возможно, через цикл data.keys или доступ к известным свойствам объекта данных.
JWTs
Аутентификация – это еще одна область, где используется JSON. Разработчики и другие пользователи используют веб-токены JSON, или JWT, для передачи утверждений для аутентификации. JWT имеют стандартный, компактный формат и криптографическую подпись для предотвращения фальсификации. Они также могут быть зашифрованы для обеспечения секретности.
JSON схема и JSON форматировщик
JavaScript и JSON невероятно гибкие, но иногда требуется больше структуры, чем они могут предоставить. В таких языках, как Java, сильная типизация и абстрактные типы (например, интерфейсы) помогают структурировать большие программы. В хранилищах SQL схема обеспечивает аналогичную структуру. Если вам нужно больше структуры в ваших документах JSON, вы можете использовать схему JSON для четкого определения характеристик ваших объектов JSON. После определения схемы ее можно использовать для валидации экземпляров объектов и обеспечения их соответствия схеме.
Еще одна проблема – это работа с машинно-обработанным JSON, который является уменьшенным и неразборчивым. К счастью, эту проблему можно легко решить. Просто перейдите к JSON Formatter & Validator (мне нравится этот инструмент, но есть и другие), вставьте ваш JSON и нажмите кнопку Process. Вы увидите легко читаемую для человека версию, которую можно использовать. Большинство IDE также имеют встроенный форматировщик JavaScript для форматирования JSON.
Использование JSON в TypeScript
TypeScript позволяет определять типы и интерфейсы, поэтому бывают случаи, когда использование JSON в TypeScript оказывается полезным. Класс, как и схема, описывает допустимые свойства экземпляра данного типа. В обычном JavaScript нет возможности ограничить свойства и их типы. Классы JavaScript подобны предложениям; программист может задать их сейчас и изменить JSON позже. Класс TypeScript, однако, принудительно определяет, какие свойства может иметь JSON и какого типа они могут быть.
Заключение
JSON – это одна из самых важных технологий, используемых в современном программном обеспечении. Она имеет решающее значение для JavaScript, но также используется в качестве общего способа взаимодействия между широким спектром технологий. К счастью, именно то, что делает JSON таким полезным, делает его относительно простым для понимания. Это лаконичный и удобный для чтения формат для предоставления текстовых данных.