Работа с JSON в JavaScript: парсинг и сериализация на практике
JSON (JavaScript Object Notation) — это легковесный формат обмена данными, который широко используется в современных веб-приложениях. В JavaScript работа с JSON встроена на уровне языка, что делает его идеальным инструментом для обмена данными между клиентом и сервером, а также для хранения конфигураций. В этой статье мы разберем, как парсить и сериализовать JSON в среде Node.js, рассмотрим практические примеры и лучшие практики.
Что такое JSON и зачем он нужен?
JSON — это текстовый формат, основанный на синтаксисе объектов JavaScript. Он поддерживает следующие типы данных:
- Строки (в двойных кавычках)
- Числа (целые и с плавающей точкой)
- Булевы значения (true/false)
- Массивы
- Объекты
- null
JSON используется повсеместно: от API-запросов до конфигурационных файлов (например, package.json). В Node.js JSON — основной формат для обмена данными между микросервисами.
Парсинг JSON: превращаем строку в объект
Для преобразования строки JSON в объект JavaScript используется метод JSON.parse(). Рассмотрим базовый пример:
const jsonString = '{"name": "Анна", "age": 30, "isStudent": false}';
const user = JSON.parse(jsonString);
console.log(user.name); // "Анна"
console.log(user.age); // 30
console.log(user.isStudent); // false
Важно: JSON-строка должна быть строго отформатирована. Все ключи и строковые значения должны быть в двойных кавычках. Одинарные кавычки или trailing commas вызовут ошибку.
Обработка ошибок при парсинге
При работе с внешними данными (из файлов, API) всегда есть риск получить некорректный JSON. Используйте try...catch:
const fs = require('fs');
try {
const data = fs.readFileSync('data.json', 'utf8');
const parsed = JSON.parse(data);
console.log('Успешно распарсено:', parsed);
} catch (error) {
if (error instanceof SyntaxError) {
console.error('Ошибка синтаксиса JSON:', error.message);
} else {
console.error('Ошибка чтения файла:', error.message);
}
}
Парсинг с функцией-ревьювером
Метод JSON.parse() принимает второй аргумент — функцию, которая может трансформировать значения. Это полезно, например, для конвертации строковых дат в объекты Date:
const json = '{"name": "Иван", "birthDate": "1990-05-15T00:00:00Z"}';
const user = JSON.parse(json, (key, value) => {
if (key === 'birthDate') {
return new Date(value);
}
return value;
});
console.log(user.birthDate instanceof Date); // true
console.log(user.birthDate.getFullYear()); // 1990
Сериализация JSON: превращаем объект в строку
Обратный процесс — преобразование объекта JavaScript в строку JSON — выполняется с помощью JSON.stringify().
const user = {
name: 'Мария',
age: 25,
skills: ['JavaScript', 'Node.js', 'Python'],
isActive: true
};
const jsonString = JSON.stringify(user);
console.log(jsonString);
// {"name":"Мария","age":25,"skills":["JavaScript","Node.js","Python"],"isActive":true}
Форматирование вывода
Для читаемости можно добавить отступы:
const prettyJson = JSON.stringify(user, null, 2);
console.log(prettyJson);
/*
{
"name": "Мария",
"age": 25,
"skills": [
"JavaScript",
"Node.js",
"Python"
],
"isActive": true
}
*/
Фильтрация и замена значений
Второй аргумент JSON.stringify() может быть массивом ключей (для фильтрации) или функцией-заменителем:
const user = {
name: 'Петр',
password: 'secret123',
email: 'petr@example.com',
role: 'admin'
};
// Фильтрация: оставляем только name и email
const filtered = JSON.stringify(user, ['name', 'email']);
console.log(filtered); // {"name":"Петр","email":"petr@example.com"}
// Функция-заменитель: скрываем пароль
const masked = JSON.stringify(user, (key, value) => {
if (key === 'password') {
return '***';
}
return value;
});
console.log(masked);
// {"name":"Петр","password":"***","email":"petr@example.com","role":"admin"}
Особенности сериализации
Некоторые значения JavaScript не поддерживаются JSON:
undefined— пропускается (или заменяется наnullв массивах)Function— удаляетсяSymbol— игнорируетсяNaNиInfinity— преобразуются вnull
const problematic = {
a: undefined,
b: function() { return 1; },
c: Symbol('test'),
d: NaN,
e: Infinity
};
console.log(JSON.stringify(problematic));
// {"d":null,"e":null}
Работа с JSON и файлами в Node.js
На практике часто требуется читать JSON из файлов и записывать в них. Рассмотрим полный цикл:
Чтение JSON из файла
const fs = require('fs');
const path = require('path');
function readJsonFile(filePath) {
try {
const absolutePath = path.resolve(filePath);
const rawData = fs.readFileSync(absolutePath, 'utf8');
return JSON.parse(rawData);
} catch (error) {
console.error(`Ошибка чтения файла ${filePath}:`, error.message);
return null;
}
}
// Использование
const config = readJsonFile('./config.json');
if (config) {
console.log('Порт сервера:', config.port);
}
Запись JSON в файл
function writeJsonFile(filePath, data, pretty = true) {
try {
const jsonString = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
fs.writeFileSync(filePath, jsonString, '