JSON обработка в JavaScript (Node.js): полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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:                    

Рекомендаций