CSV, JSON и YAML
Три формата содержат большую часть структурированных данных в мире. Конвертировать между ними легко; конвертировать так, чтобы ничего незаметно не испортить, нужно с некоторой аккуратностью.
Опубликовано
Для чего нужен каждый из них
CSV — это таблица: строки и столбцы, и ничего больше. Он читается везде, очень компактен и не может выражать ничего вложенного. JSON — это дерево: объекты внутри массивов внутри объектов, и именно на нём говорит почти каждый веб-API. YAML выражает те же структуры, что и JSON, но с помощью отступов вместо фигурных скобок, поэтому его гораздо приятнее читать и править человеку, и именно поэтому файлы конфигурации тяготеют к нему.
Ловушка приведения типов
Именно эта ловушка действительно стоит людям денег. CSV содержит только текст — пометить значение как число, дату или строку нельзя. Поэтому конвертеры угадывают, и догадки часто оказываются неверными:
- Почтовый индекс вроде
01234становится числом1234и теряет ведущий ноль. - Код товара вроде
1-2становится датой. - Длинный номер счёта становится числом с плавающей запятой и теряет последние цифры.
NA, то есть «Северная Америка», превращается в «not available» (недоступно).
Каждая из этих ошибок происходит молча. Поэтому аккуратная конвертация CSV в JSON должна оставлять каждое значение строкой и позволять решать вам — именно так конвертер на этом сайте и делает намеренно, хотя поначалу это выглядит педантично.
Что не переживёт перевод в CSV
Вложенность. Массив JSON из плоских объектов превращается в чистую таблицу. Но как только значение само является объектом или массивом, для него нет столбца. Варианты: сделать структуру плоской с составными ключами, сериализовать вложенную часть обратно в текст внутри ячейки или отбросить её — и молчаливое отбрасывание хуже всех трёх. Запись обратно в виде текста JSON внутри ячейки хотя бы сохраняет возможность восстановить данные.
Острые углы YAML
YAML приятно читать, и в нём необычайно легко ошибиться.
- Отступы — это структура, а табуляция не допускается. Неправильно поставленный пробел меняет смысл, а не вызывает ошибку.
- Некоторые «голые» слова — это булевы значения. В старом YAML
y,n,on,off,yesиnoразбираются как true или false — поэтому столбец стран, где для Норвегии указаноNO, превращается вfalse. Берите такие значения в кавычки. - Комментарии исчезают при конвертации в JSON, потому что в JSON их нет.
Обратимость не гарантируется
Конвертация JSON в YAML и обратно обычно возвращает то, с чего вы начали. Конвертация CSV в JSON и обратно — обычно нет: стиль кавычек, порядок столбцов для записей разной формы и представление пустых значений — всё это вопрос выбора, и разные инструменты выбирают по-разному. Если круговое преобразование должно быть точным, проверьте его, а не предполагайте.
Чтобы перейти от одного к другому: конвертируйте CSV в JSON, конвертируйте JSON в CSV или конвертируйте JSON в YAML — и проверьте результат, поскольку круговое преобразование не всегда точно.