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