LEARN X · ЗА 8 МИН

JSON

Экспресс-тур по JSON: типы значений, объекты, массивы, вложенность, синтаксис, экранирование, частые ошибки и JSON Schema за 8 минут.

JSON (JavaScript Object Notation) — это текстовый формат обмена данными. Он простой, человекочитаемый и понятен почти любому языку программирования. За 8 минут разберём все элементы формата: типы значений, объекты, массивы, вложенность, правила синтаксиса, экранирование и частые ошибки.

1. Что такое JSON и где применяется

JSON используют для обмена данными между сервером и клиентом (ответы API), для конфигурационных файлов и для хранения структурированных данных. Документ — это одно значение: чаще всего объект или массив.

{
  "user": "Anna",
  "age": 25,
  "isAdmin": false
}

2. Типы значений

В JSON всего шесть типов: строка (в двойных кавычках), число (целое или дробное, можно с экспонентой), логическое (true/false), null, а также объект и массив (о них ниже).

{
  "string": "привет",
  "integer": 42,
  "float": 3.14,
  "negative": -7,
  "exponent": 1.5e3,
  "boolean": true,
  "empty": null
}

3. Объекты

Объект — это набор пар «ключ: значение» в фигурных скобках { }. Ключ — всегда строка в двойных кавычках, после ключа идёт двоеточие, пары разделяются запятыми. Порядок ключей не важен.

{
  "id": 101,
  "name": "Ноутбук",
  "price": 59990,
  "inStock": true
}

4. Массивы

Массив — упорядоченный список значений в квадратных скобках [ ]. Элементы могут быть любого типа, в том числе объектами.

{
  "numbers": [1, 2, 3, 4, 5],
  "tags": ["новинка", "скидка"],
  "mixed": [1, "два", true, null],
  "users": [
    { "id": 1, "name": "Иван" },
    { "id": 2, "name": "Мария" }
  ]
}

5. Вложенность

Значения можно вкладывать друг в друга на любую глубину: объекты внутри объектов, массивы объектов внутри объекта. Так описывают реальные структуры данных.

{
  "order": {
    "id": "A-1024",
    "customer": {
      "name": "Пётр Смирнов",
      "address": {
        "city": "Москва",
        "zip": "101000"
      }
    },
    "items": [
      { "title": "Мышь", "qty": 2, "price": 1200 },
      { "title": "Клавиатура", "qty": 1, "price": 3500 }
    ],
    "paid": true
  }
}

6. Правила синтаксиса

Запомни главное: строки и ключи — только в двойных кавычках; пары и элементы разделяются запятыми; запятая после последнего элемента запрещена (нет trailing comma); комментарии в JSON не поддерживаются. Ниже — корректный документ.

{
  "name": "конфиг",
  "version": 2,
  "features": ["a", "b", "c"],
  "enabled": true
}

7. Экранирование в строках

Внутри строк специальные символы экранируются обратным слешем: \" — кавычка, \\ — слеш, \n — перевод строки, \t — табуляция, \uXXXX — символ по Unicode-коду.

{
  "quote": "Он сказал: \"привет\"",
  "path": "C:\\Users\\Anna",
  "multiline": "первая строка\nвторая строка",
  "tabbed": "колонка1\tколонка2",
  "smile": "☺"
}

8. Типичные ошибки

Чаще всего ломают JSON: одинарные кавычки вместо двойных, лишняя запятая в конце, незакрытые скобки и комментарии. Так делать нельзя (этот фрагмент невалиден и приведён как пример ошибок):

{
  'name': 'Anna',
  "tags": ["a", "b",],
  "items": [1, 2, 3
}

А вот исправленный валидный вариант:

{
  "name": "Anna",
  "tags": ["a", "b"],
  "items": [1, 2, 3]
}

9. JSON на практике

Типичный ответ API: статус, данные и метаинформация.

{
  "status": "ok",
  "data": {
    "id": 7,
    "title": "Статья про JSON",
    "author": "redaktor",
    "tags": ["json", "web"]
  },
  "meta": {
    "page": 1,
    "total": 128
  }
}

Типичный конфигурационный файл приложения:

{
  "appName": "codechick",
  "debug": false,
  "server": {
    "host": "localhost",
    "port": 8888
  },
  "allowedHosts": ["localhost", "127.0.0.1"]
}

10. JSON Schema кратко

JSON Schema — это сам JSON, который описывает структуру другого JSON: какие поля обязательны, какого они типа и в каких пределах. По схеме можно автоматически валидировать данные.

{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer", "minimum": 0 }
  },
  "required": ["name", "age"]
}

Такая схема считает валидным объект { "name": "Anna", "age": 25 } и отвергает { "name": "Anna" } — потому что отсутствует обязательное поле age.

Поддержать проект