← Назад к вопросам

В каких форматах доводилось работать

1.0 Junior🔥 151 комментариев
#Soft skills и опыт работы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Форматы данных, с которыми работал

В моей работе Node.js разработчиком доводилось работать с множеством форматов данных. Каждый имеет свои плюсы, минусы и область применения.

1. JSON (JavaScript Object Notation)

Это мой хлеб и масло. JSON везде:

// REST API (99% всего)
const user = {
  id: 1,
  name: 'John',
  email: 'john@example.com',
  roles: ['admin', 'user']
};

// Config файлы
{
  "port": 3000,
  "database": "postgres",
  "environment": "production"
}

// Логи (в современных системах)
const log = {
  timestamp: '2024-01-15T10:30:00Z',
  level: 'error',
  message: 'Database connection failed',
  context: { userId: 123 }
};

Плюсы: простота, native в JavaScript, быстрая парсинг
Минусы: не сжатый, нет типов, нет комментариев

2. GraphQL

Визуально похож на JSON, но это query язык:

// Query
query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
    posts {
      id
      title
    }
  }
}

// Mutation
mutation CreateUser($input: CreateUserInput!) {
  createUser(input: $input) {
    id
    name
    success
  }
}

// Subscription (real-time)
subscription OnUserCreated {
  userCreated {
    id
    name
  }
}

Плюсы: гибкость, типизация, интроспекция
Минусы: сложнее, требует более продуманного API

3. XML

Легаси SOAP сервисы, которые ещё живы:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetUserResponse>
      <User>
        <Id>123</Id>
        <Name>John Doe</Name>
        <Email>john@example.com</Email>
      </User>
    </GetUserResponse>
  </soap:Body>
</soap:Envelope>

Работаю с парсингом в Node.js:

const xml2js = require('xml2js');
const parser = new xml2js.Parser();
const result = await parser.parseStringPromise(xmlString);

Плюсы: расширяемый, поддерживает атрибуты и namespaces
Минусы: verbose, медленнее парсить, сложный синтаксис

4. CSV

Для экспорта/импорта данных:

// Пример CSV
id,name,email,role
1,John,john@example.com,admin
2,Jane,jane@example.com,user
3,Bob,bob@example.com,user

// Парсинг в Node.js
const csv = require('csv-parser');
const fs = require('fs');

const users = [];
fs.createReadStream('users.csv')
  .pipe(csv())
  .on('data', (row) => {
    users.push(row);
  })
  .on('end', () => {
    console.log(users);
  });

Плюсы: компактный, легко парсить, Excel совместимый
Минусы: нет вложенных структур, ambiguous parsing

5. Protocol Buffers (protobuf)

Для микросервисной коммуникации:

syntax = "proto3";

message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
  repeated string roles = 4;
}

message GetUserRequest {
  int32 id = 1;
}

message GetUserResponse {
  User user = 1;
}

Плюсы: очень компактный, быстрый парсинг, версионирование
Минусы: нужна компиляция, не human-readable

6. MessagePack

Для кэширования и очередей:

const msgpack = require('msgpack5')();

const user = {
  id: 1,
  name: 'John',
  email: 'john@example.com'
};

// Сериализация (бинарный формат)
const buffer = msgpack.encode(user);

// Десериализация
const decoded = msgpack.decode(buffer);

Плюсы: компактнее JSON, быстрее, binary безопасный
Минусы: не human-readable

7. YAML

Для конфигов и CI/CD:

server:
  port: 3000
  host: localhost

database:
  url: postgresql://localhost:5432/myapp
  pool:
    min: 5
    max: 20

logging:
  level: debug
  format: json
  transports:
    - console
    - file: logs/app.log

Плюсы: читаемый, поддерживает комментарии, простой синтаксис
Минусы: whitespace-sensitive, медленнее парсить

8. TOML

Для конфигов (становится популярнее):

[server]
port = 3000
host = "localhost"

[database]
url = "postgresql://localhost:5432/myapp"
pool.min = 5
pool.max = 20

[logging]
level = "debug"
format = "json"

Плюсы: очень читаемый, явный синтаксис, минимум ошибок
Минусы: меньше поддержка, чем JSON/YAML

9. Binary форматы

Изображения (JPEG, PNG, WebP)

const sharp = require('sharp');

// Преобразование и оптимизация
await sharp('input.jpg')
  .resize(800, 600)
  .webp({ quality: 80 })
  .toFile('output.webp');

Архивы (ZIP, GZIP)

const zlib = require('zlib');
const fs = require('fs');

fs.createReadStream('large-file.json')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('large-file.json.gz'));

PDF

const PDFDocument = require('pdfkit');

const doc = new PDFDocument();
doc.fontSize(25).text('Invoice', 100, 100);
doc.pipe(fs.createWriteStream('invoice.pdf'));
doc.end();

10. HTML / XML для веб-скрейпинга

const cheerio = require('cheerio');

const html = '<div class="product"><h1>Laptop</h1><price>999</price></div>';
const $ = cheerio.load(html);

const productName = $('.product h1').text(); // Laptop
const price = $('.product price').text();    // 999

11. SQL

Технически не формат данных, но work с query languages:

-- SELECT
SELECT u.id, u.name, COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
WHERE u.created_at > NOW() - INTERVAL '30 days'
GROUP BY u.id
ORDER BY post_count DESC;

-- INSERT / UPDATE
UPDATE users SET last_seen = NOW() WHERE id = $1;

Плюсы: мощный, гибкий, стандартизированный
Минусы: зависит от БД, N+1 проблемы

12. Base64

Для кодирования бинарных данных в текст:

// Кодирование
const encoded = Buffer.from('Hello World').toString('base64');
// SGVsbG8gV29ybGQ=

// Декодирование
const decoded = Buffer.from('SGVsbG8gV29ybGQ=', 'base64').toString();
// Hello World

// Использование в URLs и data URIs
const dataUri = `data:image/png;base64,${base64Data}`;

13. Edge cases: Multipart Form Data

Для файл загрузок:

const express = require('express');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
  console.log(req.file); // { fieldname, originalname, encoding, mimetype, size, ... }
  res.json({ uploaded: true });
});

Как я выбираю формат

JSON — стандарт для REST API, почти всегда
GraphQL — когда нужна гибкость в queries
Protobuf — для высоконагруженных микросервисов
CSV — для экспорта/импорта в Excel
YAML — для конфигов и CI/CD
MessagePack — для Redis, очередей (нужна скорость)
XML — только если legacy система требует

Вывод

В современной разработке я 90% времени работаю с JSON. Но хороший разработчик должен знать плюсы и минусы каждого формата и выбирать подходящий для конкретной задачи. Это показывает понимание tradeoffs'ов и возможность писать эффективный код.