Работа с JSON в JavaScript: парсинг и сериализация данных

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

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

Начать курс

Введение в 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                

Блоги

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