DevOps-інженер експортує конфігурацію Kubernetes як YAML, але повинен надіслати її до API, що приймає лише JSON. Аналітик отримує дані відповіді API у JSON, але потребує їх у таблиці. Data scientist експортує CSV з бази даних, але потребує структурованого JSON для веб-дашборду.
Конвертація форматів — це не просто механічна операція. Кожен формат робить різні компроміси, і розуміння того, що втрачається при перетворенні, не менш важливе, ніж знання як конвертувати.
Три формати, три філософії
Кожен формат був створений для різної аудиторії та різної задачі:
| Формат | Створений | Призначення | Основна філософія |
|---|---|---|---|
| CSV | ~1972 | Обмін даними між програмами | Максимальна простота — лише рядки та стовпці |
| JSON | 2001 | Веб-обмін даними | Машиночитані структуровані дані зі строгими правилами |
| YAML | 2001 | Конфігураційні файли | Людиночитані структуровані дані з мінімальним синтаксисом |
CSV передбачає, що ваші дані — плоска таблиця. Кожне значення — рядок. Немає концепції вкладеності, типізації чи метаданих.
JSON передбачає, що ваші дані мають структуру — об'єкти, масиви, типи (рядки, числа, логічні значення, null). Він строгий та однозначний, що робить його ідеальним для машин, але багатослівним для людей.
YAML передбачає, що людина буде читати та редагувати файл. Використовує відступи замість фігурних дужок, підтримує коментарі та має більш вільний синтаксис. Технічно YAML — надмножина JSON, тобто будь-який валідний JSON-документ також є валідним YAML.
YAML — надмножина JSON Ви можете вставити JSON-документ безпосередньо в YAML-парсер, і він спрацює. Зворотне не вірно — такі функції YAML, як коментарі, якорі та багаторядкові рядки, не мають еквіваленту в JSON.
Реальні сценарії конвертації
Міграція конфігурацій (JSON → YAML, YAML → JSON)
Це найпоширеніша конвертація. Різні інструменти очікують різні формати конфігурацій:
- Docker Compose, Kubernetes, GitHub Actions, Ansible — YAML
- package.json, tsconfig.json, ESLint — JSON
- Міграція між інструментами часто означає конвертацію конфігурацій
Ця конвертація безвтратна в обох напрямках щодо вмісту даних — але коментарі YAML втрачаються при конвертації в JSON, оскільки JSON не має синтаксису коментарів.
Аналіз даних (JSON → CSV)
Відповіді API надходять у JSON. Аналітикам потрібні таблиці. Ця конвертація добре працює для плоских JSON-масивів — масиви об'єктів з ідентичними ключами природно відображаються на рядки та стовпці.
Але вона ламається з вкладеними даними. JSON-об'єкт з полем address.city та масивом skills не має природного представлення в CSV. Конвертер повинен вирішити: згладити вкладені ключі (address.city стає стовпцем), серіалізувати вкладені значення як рядки чи відкинути їх.
Імпорт даних (CSV → JSON)
Зворотний сценарій: імпорт табличних даних у веб-додаток або API. Конвертація CSV → JSON створює масив об'єктів із заголовками стовпців як ключами. Підступ у тому, що CSV не має інформації про типи — число 42, рядок "42" та логічне значення true — все це просто текст у CSV. Конвертер повинен вгадувати типи.
Читабельність (JSON → YAML)
Іноді потрібно просто зробити щільний JSON-конфіг читабельним. Конвертація в YAML дає чисті відступи та можливість додавати коментарі для документації. Це особливо цінно для великих конфігураційних файлів, які підтримуватиме команда.
Що втрачається при конвертації
Це критичне знання, що заощаджує час на налагодження:
| Конвертація | Що втрачається |
|---|---|
| YAML → JSON | Коментарі (JSON не має синтаксису коментарів) |
| JSON → CSV | Вкладеність (CSV плоский), типи (все стає текстом), масиви |
| CSV → JSON | Нічого (але типи потрібно виводити — "42" vs 42) |
| CSV → YAML | Нічого (та сама проблема виведення типів) |
| JSON → YAML | Нічого (YAML — надмножина JSON) |
| YAML → CSV | Коментарі, вкладеність, типи, якорі/псевдоніми |
Закономірність очевидна: конвертації в бік CSV втрачають найбільше інформації, бо CSV — найпростіший формат. Конвертації між JSON та YAML майже безвтратні. А коментарі YAML завжди втрачаються при виході з YAML.
Двосторонні vs односторонні Конвертації JSON-YAML та YAML-JSON фактично двосторонні (безпечні для кругового перетворення, за винятком коментарів). Конвертації JSON-CSV та YAML-CSV для складних даних односторонні — не можна відновити вкладеність із плоского CSV.
Типові підводні камені при конвертації
Пастки типового приведення YAML
YAML автоматично інтерпретує деякі рядки як не-рядкові типи. Слово no стає логічним false. Слово yes стає true. Рядок 1.0 стає числом з плаваючою комою. Коди країн як NO (Норвегія) відомо спричиняли помилки. Завжди беріть неоднозначні значення в лапки в YAML.
Плутанина з роздільниками та кодуванням CSV
Не всі CSV використовують коми. Європейські CSV часто використовують крапку з комою (бо кома є десятковим роздільником у багатьох європейських форматах чисел). Значення, розділені табуляцією (TSV) — ще один варіант. А розбіжності в кодуванні символів (UTF-8 vs Latin-1) дають спотворені символи з діакритичними знаками.
Проблема кінцевої коми в JSON
JSON не допускає кінцеву кому. Це валідний JavaScript: {"a": 1, "b": 2,} — але невалідний JSON. Одна зайва кома спричиняє помилку парсингу.
Продуктивність на великих наборах даних
Для наборів даних з мільйонами рядків CSV значно ефективніший за JSON чи YAML. JSON додає дужки та лапки для кожного значення. CSV з 1 мільйоном рядків може бути 50 МБ; еквівалентний JSON може сягати 150 МБ.
Вибір правильного формату на старті
Замість конвертації після факту, вибір правильного формату наперед уникає втрати інформації:
- Табличні дані для таблиць або баз даних — CSV
- Структуровані дані для API або веб-додатків — JSON
- Конфігурація, яку редагуватимуть люди — YAML
- Складні вкладені дані з коментарями — YAML
- Обмін даними між системами — JSON
Далі
Конвертуйте між JSON, YAML та CSV миттєво за допомогою браузерних інструментів:
- Конвертація форматів даних — вставте дані, оберіть цільовий формат, завантажте результат
- Форматування JSON — валідація, форматування та мініфікація JSON
- Конвертер JSON → CSV — конвертація JSON-масивів у CSV для таблиць
- Конвертер YAML-JSON — конвертація між YAML та JSON з урахуванням коментарів
