Зачем превращать таблицу в JSON
CSV — это то, что выгружают электронные таблицы, CRM, банки и аналитические дашборды. JSON — то, что потребляют веб-API, код на JavaScript, NoSQL-базы и большинство систем конфигурации. Конвертация нужна постоянно: заполнить тестовую базу данными из таблицы, которую ведёт коллега, превратить список товаров в фикстуры для фронтенд-прототипа, передать список редиректов или переводов в скрипт сборки или отправить пачку записей в API, который принимает только JSON.
На выходе получается массив JSON с одним объектом на каждую строку данных. Строка заголовка задаёт имена свойств, так что таблица со столбцами sku, title и price превращается в объекты ровно с этими тремя ключами — их можно сразу перебирать в цикле.
Как парсер читает ваш CSV
CSV выглядит тривиально, пока значение не содержит разделитель. Парсер следует правилам RFC 4180 — самого близкого к стандарту документа, который есть у CSV:
- Поле в двойных кавычках может содержать разделитель, переносы строк и кавычки.
"Smith, John"остаётся одним значением. - Кавычка внутри поля в кавычках записывается дважды:
"6"" pipe"превращается в6" pipe. - Строки могут заканчиваться на CRLF в стиле Windows или на LF в стиле Unix; обрабатываются оба варианта.
- Метка порядка байтов в начале файла, которую Excel добавляет при сохранении в CSV UTF-8, удаляется, чтобы она не прилипла к имени первого столбца.
- Полностью пустые строки пропускаются.
Разделитель выбирается подсчётом запятых, точек с запятой, табуляций и вертикальных черт в первой строке — побеждает самый частый. Это работает почти для любой выгрузки, но предполагает, что заголовок показателен. Если заголовок состоит из одного столбца без разделителей, предполагается запятая.
Пробелы вокруг имён в заголовке обрезаются, так что price с пробелами становится ключом price. Значения в строках данных сохраняются в точности как записаны, включая пробелы в начале и в конце.
Типизированные значения или строки
Когда включена опция «Определять числа и булевы значения», каждая ячейка проверяется по короткому списку правил:
- Обычные целые и десятичные числа вроде
42,-7и19.99становятся числами JSON, если в них не больше 15 цифр. - Ровно
trueиfalseв нижнем регистре становятся булевыми значениями.TRUE,Yesили1остаются как есть. - Пустая ячейка становится
null. - Всё остальное, включая более длинные строки из цифр,
1.5e3,+5,.5,1,234и даты, остаётся строкой.
Для большинства данных это удобно, но числа в JSON не хранят форматирование, поэтому некоторые значения после типизации меняют смысл:
- Ведущие нули исчезают. Американский почтовый индекс
02134превращается в2134, а артикул007— в7. - Длинные строки цифр потеряли бы точность. Числа в JavaScript точны лишь примерно до 15 значащих цифр, поэтому значения с большим числом цифр, например 20-значный номер заказа или номер карты, сохраняются строками, а не округляются.
- Телефонные номера без плюса и пробелов тоже становятся числами.
Если в каком-то столбце хранятся идентификаторы, а не количества, отключите опцию и преобразуйте немногие действительно числовые поля в своём коде. При отключённой опции пустые ячейки становятся пустыми строками, а не null.
Если результат выглядит неправильно
- Всё попадает в один ключ. Разделитель не определился — обычно потому, что в заголовке другой разделитель, чем в данных, или его нет вовсе. Проверьте первую строку.
- Значения сдвинуты на один столбец. Поле содержит разделитель, но не заключено в кавычки. Выгрузите файл заново из исходного приложения, а не правьте вручную: таблицы берут такие поля в кавычки автоматически.
- Лишние столбцы пропадают. Ключи берутся только из заголовка, поэтому ячейки за последним столбцом заголовка отбрасываются. Строки, где ячеек меньше, получают для недостающих
nullили пустую строку. - Два столбца — один ключ. Если имя в заголовке повторяется, в каждом объекте более поздний столбец перезаписывает более ранний. Сначала переименуйте один из них.
- Странные символы вроде é. Файл сохранён в устаревшей кодировке. Пересохраните его как CSV UTF-8 и вставьте снова.
Работа с результатом
JSON выводится с отступом в 2 пробела — это удобно и для чтения, и для коммита в репозиторий. Чтобы минифицировать его для API-запроса или изменить отступы, пропустите его через JSON-форматировщик. Чтобы после правок пройти обратный путь, JSON в CSV заново соберёт таблицу из массива. Конвертация целиком выполняется на странице, что важно, когда в выгрузке есть имена клиентов, email-адреса или зарплаты.