1. Что такое JSON (JavaScript Object Notation)?
JSON (читается как «джейсон», а не «жэсон»!) расшифровывается как JavaScript Object Notation. Несмотря на слово «JavaScript» в названии, JSON — это универсальный формат, поддерживаемый практически всеми языками программирования, включая Java.
JSON придумал Дуглас Крокфорд в начале 2000-х как простой способ обмена данными между браузером и сервером. До него преобладал XML — многословный и перегруженный тегами.
JSON оказался компактнее, проще и легко читаем «глазами». Он быстро стал стандартом де-факто для обмена данными между клиентом и сервером, особенно в вебе и мобильных приложениях.
Почему JSON стал стандартом?
- Простота синтаксиса — легко писать и читать вручную.
- Компактность — нет лишних тегов и «воды».
- Читаемость — даже гуманитарий поймёт, что происходит.
- Лёгкость парсинга — у большинства языков есть встроенные/сторонние библиотеки.
- Межъязыковость — Java, Python, Kotlin и др. — JSON поддерживают все.
- Стандарт для REST API — подавляющее большинство API возвращают JSON.
Сравнение с XML
| JSON | XML | |
|---|---|---|
| Читаемость | Очень высокая | Средняя (много тегов) |
| Размер | Компактный | Более громоздкий |
| Парсинг | Простой | Требует больше усилий |
| Расширяемость | Поддерживает вложенность | Поддерживает вложенность |
| Строгость | Менее формальный | Можно описывать схемы |
| Популярность (2020+) | Очень высокая | Используется, но реже |
Победа JSON почти по всем пунктам. Тем не менее XML остаётся актуальным там, где нужны сложные схемы, строгая типизация, валидация по XSD, поддержка комментариев и атрибутов — например, в старых системах и банковском ПО.
На практике, если вы не пишете ПО для банка или космического корабля, — используйте JSON.
2. Базовый синтаксис JSON
Если вы работали с объектами JavaScript или словарями в других языках, синтаксис покажется знакомым. В Java прямого «словаря» нет, его роль исполняют коллекции из java.util, в первую очередь Map<K, V> (чаще всего — HashMap<K, V>).
Основные элементы
- Объекты — набор пар «ключ: значение», обёрнутых в { }.
- Массивы — упорядоченные списки значений, обёрнутые в [ ].
Пример объекта:
{
"name": "Alice",
"age": 25
}
Пример массива:
[1, 2, 3, 4, 5]
Пример объекта с массивом:
{
"students": [
"Ivan",
"Maria",
"John"
]
}
Допустимые типы значений
В JSON можно использовать только следующие типы данных:
| Тип | Пример | Описание |
|---|---|---|
| Строка | |
Всегда в двойных кавычках |
| Число | |
Целые и дробные |
| Булево | |
Логические значения |
| null | |
«Пусто», отсутствие значения |
| Объект | |
Набор пар «ключ: значение» |
| Массив | |
Список значений |
Внимание: ключи в объектах — это всегда строки в двойных кавычках, например "name". Одинарные кавычки не допускаются.
Примеры валидного JSON
{
"id": 1,
"name": "Bob",
"active": true,
"scores": [10, 20, 30],
"profile": {
"email": "bob@example.com",
"phone": null
}
}
Пример невалидного JSON (ошибки)
{
name: 'Bob', // Ошибка: ключи и строки — только в двойных кавычках!
age: 25,
}
3. Структура данных: вложенность объектов и массивов
JSON поддерживает глубокую вложенность: объекты в объектах, массивы в объектах, объекты в массивах и т. д. Это как матрёшка.
Пример сложного JSON-документа
{
"university": "Java University",
"students": [
{
"name": "Ivan",
"age": 20,
"courses": ["Math", "Java", "English"]
},
{
"name": "Maria",
"age": 19,
"courses": ["Biology", "Java", "Art"]
}
],
"active": true
}
В корневом объекте есть строковое поле "university", булево поле "active" и массив "students", в котором лежат объекты студентов.
Визуальная схема (блок-схема)
{
"ключ": значение,
"массив": [
{ "ключ": значение },
{ "ключ": значение }
],
"объект": {
"ключ": значение
}
}
4. Преимущества JSON
Почему JSON так популярен?
- Легко читается человеком и машиной — структуру легко понять.
- Компактность — минимум лишних символов.
- Простота парсинга — множество библиотек для чтения/записи.
- Стандарт для REST API и мобильных приложений — повсеместно используется.
- Гибкость — описывает как простые списки, так и древовидные структуры.
- Конфиги, настройки, хранение данных — часто используется в конфигурациях.
- Поддержка всеми языками — Java, Python, Go, Rust и др.
5. Практика: разбор примеров JSON-файлов
Пример 1: Список пользователей
[
{
"id": 1,
"name": "Alice"
},
{
"id": 2,
"name": "Bob"
}
]
Это массив, где каждый элемент — объект пользователя.
Пример 2: Конфигурация приложения
{
"debug": true,
"maxConnections": 100,
"database": {
"host": "localhost",
"port": 5432,
"user": "admin",
"password": "qwerty"
}
}
Объект с вложенным объектом "database". Очень похоже на реальные настройки приложений.
Пример 3: Ошибки в JSON
{
"name": "Alice",
"age": 25,
} // Ошибка: лишняя запятая перед закрывающей скобкой!
Запомните: в JSON нельзя ставить запятую после последнего элемента.
Пример 4: Ключи без кавычек
{ name: "Alice", age: 25 } // Ошибка: ключи должны быть в двойных кавычках!
6. Полезные нюансы
Таблица: что можно и что нельзя в JSON
| Можно | Нельзя |
|---|---|
|
|
|
|
|
|
|
|
|
|
Краткое сравнение JSON и Java-объектов
| Java | JSON |
|---|---|
|
Число, true/false |
|
"строка" |
| List<T>, массив | [значение1, значение2, ...] |
|
{ "ключ": значение, ... } |
|
null |
| Класс с полями | { "поле": значение, ... } |
Пример: Java-класс и его JSON-представление
public class Student {
public String name;
public int age;
}
{
"name": "Alice",
"age": 20
}
7. Типичные ошибки при работе с JSON
Ошибка №1: Одинарные кавычки вместо двойных. JSON принимает только двойные кавычки для ключей и строк.
{ 'name': 'Alice' } // Ошибка!
Ошибка №2: Лишняя запятая. Нельзя ставить запятую после последнего элемента.
{ "name": "Alice", } // Ошибка!
Ошибка №3: Ключи без кавычек. Ключи всегда должны быть в двойных кавычках.
{ name: "Alice" } // Ошибка!
Ошибка №4: Числа с ведущими нулями. Такие числа недопустимы.
{ "age": 025 } // Ошибка!
Ошибка №5: Использование undefined. В JSON нет undefined, используйте null.
{ "value": undefined } // Ошибка!
Ошибка №6: True/False с большой буквы. В JSON только true и false (строчными).
{ "active": True } // Ошибка!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ