JSON в JavaScript: полный гайд по парсингу и сериализации

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

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

Начать курс

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

Блоги

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