Введение в JSON и его роль в современном JavaScript
JSON (JavaScript Object Notation) — это легковесный формат обмена данными, который стал стандартом де-факто для передачи информации между клиентом и сервером. Несмотря на то, что название содержит "JavaScript", JSON является языково-независимым форматом, но его синтаксис очень близок к синтаксису объектов JavaScript. В среде Node.js работа с JSON — это ежедневная задача для любого backend-разработчика: от чтения конфигурационных файлов до обработки API-запросов.
В этой статье мы подробно разберем два ключевых метода для работы с JSON в JavaScript: JSON.parse() для парсинга (преобразования строки в объект) и JSON.stringify() для сериализации (преобразования объекта в строку). Вы узнаете не только основы, но и продвинутые техники, которые помогут вам писать более надежный и производительный код на Node.js.
JSON.parse(): Преобразование строки в объект JavaScript
Метод JSON.parse() принимает строку в формате JSON и возвращает соответствующий объект JavaScript. Это основная операция при получении данных от API или чтении JSON-файлов.
Базовый синтаксис и простой пример
Синтаксис метода предельно прост:
JSON.parse(text[, reviver])
Где text — это строка JSON, а необязательный параметр reviver — функция, которая может преобразовывать значения перед возвратом.
Рассмотрим базовый пример:
const jsonString = '{"name": "Node.js", "version": 18, "features": ["async", "await"]}';
const parsedObject = JSON.parse(jsonString);
console.log(parsedObject.name); // "Node.js"
console.log(parsedObject.version); // 18
console.log(parsedObject.features); // ["async", "await"]
Обработка ошибок при парсинге
Одна из самых частых ошибок — попытка распарсить некорректный JSON. В Node.js это приведет к выбрасыванию исключения SyntaxError. Всегда используйте конструкцию try...catch для безопасного парсинга:
const invalidJson = '{"name": "Node.js", version: 18}'; // Ошибка: ключ version без кавычек
try {
const data = JSON.parse(invalidJson);
console.log(data);
} catch (error) {
if (error instanceof SyntaxError) {
console.error('Ошибка парсинга JSON:', error.message);
// Вывод: Ошибка парсинга JSON: Expected property name in JSON at position 27
}
}
Использование параметра reviver для трансформации данных
Параметр reviver позволяет модифицировать значения во время парсинга. Это особенно полезно для преобразования строковых дат в объекты Date:
const jsonWithDate = '{"event": "Конференция", "date": "2024-12-15T10:00:00Z"}';
const result = JSON.parse(jsonWithDate, (key, value) => {
if (key === 'date') {
return new Date(value);
}
return value;
});
console.log(result.date instanceof Date); // true
console.log(result.date.toLocaleDateString('ru-RU')); // 15.12.2024
JSON.stringify(): Преобразование объекта в JSON-строку
Метод JSON.stringify() выполняет обратную операцию — преобразует объект JavaScript в строку JSON. Это необходимо при отправке данных на сервер или сохранении состояния в файл.
Синтаксис и базовые примеры
Полный синтаксис метода включает три параметра:
JSON.stringify(value[, replacer[, space]])
- value — объект для сериализации (обязательный)
- replacer — функция или массив для фильтрации свойств (необязательный)
- space — количество пробелов для форматирования (необязательный)
Простой пример сериализации:
const user = {
id: 101,
name: "Алексей",
roles: ["admin", "editor"],
isActive: true
};
const jsonString = JSON.stringify(user);
console.log(jsonString);
// {"id":101,"name":"Алексей","roles":["admin","editor"],"isActive":true}
Форматирование вывода с помощью параметра space
Параметр space делает JSON-строку читаемой для человека. Это особенно полезно при записи в файлы или логировании:
const prettyJson = JSON.stringify(user, null, 2);
console.log(prettyJson);
/*
{
"id": 101,
"name": "Алексей",
"roles": [
"admin",
"editor"
],
"isActive": true
}
*/
Фильтрация свойств с помощью replacer
Параметр replacer может быть массивом строк (только указанные ключи будут включены) или функцией:
Вариант с массивом:
const filteredJson = JSON.stringify(user, ['name', 'roles']);
console.log(filteredJson);
// {"name":"Алексей","roles":["admin","editor"]}
Вариант с функцией:
const customJson = JSON.stringify(user, (key, value) => {
if (key === 'isActive') {
return undefined; // Исключаем поле
}
if (typeof value === 'string') {
return value.toUpperCase(); // Преобразуем строки в верхний регистр
}
return value;
});
console.log(customJson);
// {"id":101,"name":"АЛЕКСЕЙ","roles":["ADMIN","EDITOR"]}
Практические примеры работы с JSON в Node.js
Рассмотрим несколько реальных сценариев использования JSON в backend-разработке на Node.js.
Чтение и запись JSON-файлов
Часто требуется сохранять конфигурацию или кэш в файловой системе. Используем встроенный модуль fs:
const fs = require('fs');
const path = require('path');
// Чтение JSON-файла
function readJsonFile(filePath) {
try {
const rawData = fs.readFileSync(filePath, 'utf-8');
return JSON.parse(rawData);
} catch (error) {
console.error('Ошибка чтения файла:', error.message);
return null;
}
}
// Запись JSON-файла с форматированием
function writeJsonFile(filePath, data) {
try {
const jsonString = JSON.stringify(data, null, 2);
fs.writeFileSync(filePath, jsonString, 'utf-8');
console.log('Файл успешно сохранен:', filePath);
} catch (error) {
console