Работа с JSON в Node.js: от основ до продвинутых техник
JSON (JavaScript Object Notation) — это легкий формат обмена данными, который стал стандартом де-факто для веб-API и конфигурационных файлов. В Node.js работа с JSON встроена на уровне ядра, что делает его обработку быстрой и удобной. В этой статье мы разберем все аспекты работы с JSON: от базового парсинга до обработки больших файлов с помощью потоков.
Основы: JSON.parse() и JSON.stringify()
Два глобальных метода — JSON.parse() и JSON.stringify() — являются основой всей работы с JSON в JavaScript.
JSON.parse() — преобразование строки в объект
Метод JSON.parse() принимает строку в формате JSON и возвращает соответствующий объект JavaScript. Если строка содержит синтаксическую ошибку, будет выброшено исключение SyntaxError.
const jsonString = '{"name": "Анна", "age": 30, "isAdmin": false}';
const user = JSON.parse(jsonString);
console.log(user.name); // "Анна"
console.log(user.age); // 30
Второй необязательный параметр — функция reviver, которая позволяет трансформировать значения в процессе парсинга:
const jsonString = '{"date": "2024-01-15T10:30:00Z", "count": "42"}';
const obj = JSON.parse(jsonString, (key, value) => {
if (key === 'date') return new Date(value);
if (key === 'count') return parseInt(value, 10);
return value;
});
console.log(obj.date instanceof Date); // true
console.log(typeof obj.count); // "number"
JSON.stringify() — преобразование объекта в строку
Метод JSON.stringify() делает обратное — превращает объект JavaScript в JSON-строку. Он принимает три параметра: значение, функцию-заменитель (или массив ключей) и количество пробелов для форматирования.
const user = {
name: "Иван",
age: 25,
roles: ["admin", "editor"],
metadata: null
};
// Базовое использование
const json = JSON.stringify(user);
console.log(json);
// {"name":"Иван","age":25,"roles":["admin","editor"],"metadata":null}
// С форматированием
const prettyJson = JSON.stringify(user, null, 2);
console.log(prettyJson);
/*
{
"name": "Иван",
"age": 25,
"roles": ["admin", "editor"],
"metadata": null
}
*/
Функция-заменитель позволяет фильтровать или преобразовывать значения:
const user = { name: "Петр", password: "secret123", age: 28 };
const safeJson = JSON.stringify(user, (key, value) => {
if (key === 'password') return undefined; // удаляем пароль
return value;
});
console.log(safeJson); // {"name":"Петр","age":28}
Чтение и запись JSON-файлов в Node.js
В реальных проектах JSON-данные часто хранятся в файлах. Node.js предоставляет модуль fs (file system) для работы с файловой системой.
Чтение JSON из файла
const fs = require('fs');
// Синхронное чтение
try {
const data = fs.readFileSync('config.json', 'utf8');
const config = JSON.parse(data);
console.log(config.port); // 3000
} catch (err) {
console.error('Ошибка чтения файла:', err.message);
}
// Асинхронное чтение (рекомендуется)
fs.readFile('config.json', 'utf8', (err, data) => {
if (err) {
console.error('Ошибка:', err);
return;
}
const config = JSON.parse(data);
console.log(config);
});
Запись JSON в файл
const fs = require('fs');
const settings = {
theme: "dark",
language: "ru",
notifications: true
};
// Запись с форматированием
fs.writeFileSync('settings.json', JSON.stringify(settings, null, 2), 'utf8');
console.log('Файл settings.json создан');
// Асинхронная запись
fs.writeFile('settings.json', JSON.stringify(settings), (err) => {
if (err) throw err;
console.log('Данные сохранены');
});
Продвинутые техники обработки JSON
Валидация JSON
Перед использованием данных всегда проверяйте их корректность. Простая функция-валидатор:
function isValidJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
const test1 = '{"valid": true}';
const test2 = '{invalid: true}';
console.log(isValidJSON(test1)); // true
console.log(isValidJSON(test2)); // false
Глубокая фильтрация объектов
Иногда нужно извлечь только определенные поля из сложного JSON:
const apiResponse = {
user: { id: