В каких форматах доводилось работать
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Форматы данных, с которыми работал
В моей работе 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'));
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'ов и возможность писать эффективный код.