JSON
JSON (JavaScript Object Notation) – формат для хранения и передачи структурированных данных, основан на синтаксисе объектов JavaScript (но не привязан к нему).
Синтаксис JSON повторяет синтаксис объекта в JavaScript: данные записываются в виде пар «ключ : значение» и разделяются запятыми. Важно помнить, что после последней пары запятая не ставится.
Ключи – строковые переменные, а значения могут быть строками, числами, булевыми параметрами, объектами, массивами или null.
JSON-файл может быть сохранён как текстовый файл с расширением .json. Пример содержимого такого файла:
{
"name": "John Smith",
"age": 37
}
Даты в JSON переводятся в строковый формат ISO 8601: 2023-08-24T20:45:03.408Z.
Для хранения данных в JSON используются две структуры – объекты и массивы.
Объект – неупорядоченная коллекция. Для неё непринципиально, в каком порядке следуют пары «ключ : значение». Пример объекта – выше.
Массив – упорядоченный список значений. Пример:
[
"яблоко",
"персик",
"банан",
"киви"
]
В отличие от объекта, в массиве важен порядок элементов. Тут нет ключей, поэтому обращаться к значениям мы можем только по индексу элемента. Важно помнить, что у первого элемента индекс 0.
Объекты и массивы могут быть вложены друг в друга, количество уровней вложенности не ограничено.
{
// Это комментарий
}
JSON5 – расширение JSON, повышающее читаемость и удобство записи данных. Особенности JSON5:
допустимы комментарии;
необязательно использовать кавычки для ключей;
есть специальный формат для дат и времени;
поддерживает многострочный текст;
допускает запись чисел с подчёркиваниями для улучшения читаемости;
поддерживает шестнадцатеричную и восьмеричную систему счисления.
JSON Schema позволяет добавить в файл метаданные, например – какие поля обязательные и какие типы данных они могут содержать. JSON Schema используется для валидации данных при обмене информацией. Пример «схемы»:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
},
"address": {
"type": "object",
"properties": {
"city": {
"type": "string"
},
"zip": {
"type": "string"
}
},
"required": ["city", "zip"]
}
},
"required": ["name", "age", "address"]
}
Здесь в первой строке указана ссылка на версию спецификации JSON Schema. Далее «схема» говорит, что данные должны быть объектом типа «object»; объект должен содержать три обязательных поля: «name», «age» и «address»; у каждого поля свой тип данных: «string» для имени, «number» для возраста и «object» для адреса; поле «address» должно быть объектом и содержать два обязательных подполя: «city» и «zip», которые относятся к строкам.
Сериализация – преобразование данных из внутреннего формата, например из JavaScript-объекта, в формат JSON, который может быть отправлен на сервер. В большинстве языков программирования для этого есть встроенные функции/библиотеки. Например, в JavaScript преобразование объекта person в JSON-файл выглядит так:
const person = {
name: 'John Doe',
age: 30,
address: {
city: 'New York',
zip: '10001'
}
};
const jsonString = JSON.stringify(person); // Метод JSON.stringify преобразует объект person в JSON-формат
console.log(jsonString); // Выводит данные в консоль
Десериализация, наоборот, преобразует данные из формата JSON обратно во внутренний формат, с которым программист может работать в своём коде:
const jsonString = '{"name":"John Doe","age":30,"address":{"city":"New York","zip":"10001"}}';
const person = JSON.parse(jsonString); // Преобразуем JSON в объект person
console.log(person); // Выводит данные в консоль
JSON Validator https://jsonlint.com/
Пример получения доступа к данным в JSON-файле, который содержит объекты и массивы:
superHeroes["members"][1]["powers"][2];
Даём имя переменной – superHeroes. Внутри неё хотим получить доступ к свойству members, поэтому пишем ['members']. members содержит массив с объектами. Мы хотим получить доступ ко второму объекту внутри этого массива, поэтому пишем [1]. Внутри этого объекта мы хотим получить доступ к свойству powers, поэтому пишем ['powers']. В свойстве powers находится массив, содержащий сверхспособности выбранного героя. Нам нужен третий, поэтому пишем [2].
Last updated