Конвертировать CSV в JSON
Превратите CSV-файл или вставленную таблицу в чистый JSON — с типизированными числами и логическими значениями, вложенными объектами из заголовков с точками и ровно той структурой, которую ждёт ваш код.
- Не сохраняется
- Без очереди и ожидания
- Без регистрации и водяных знаков
Как это работает
Добавьте CSV
Перетащите файл .csv или .tsv либо вставьте данные. Разделитель и кодировка определяются автоматически.
Выберите структуру
Массив объектов, массив массивов, объект с ключами из первого столбца или JSON Lines — а также типы, пустые значения и отступы.
Скопируйте или скачайте
Скопируйте JSON в буфер обмена или сохраните его как файл .json.
Где CSV расплывчатее, чем кажется
У CSV нет настоящего стандарта — есть рекомендательная спецификация 2005 года, описывающая то, что делает большинство инструментов, и масса программ, которые делают что-то другое. Поэтому первая задача — понять, что на самом деле представляет собой файл: чем разделены значения — запятыми, точками с запятой или табуляциями (в европейских региональных настройках экспортируется точка с запятой, потому что запятая там — десятичный разделитель), является ли первая строка заголовком и как обрабатываются кавычки. Поле в кавычках может законно содержать запятые, переводы строк и удвоенные кавычки — вот почему разбивать строку по запятым неправильно и почему наивный парсер портит любой файл, где есть адрес.
Вторая задача — типы, и у JSON на этот счёт есть мнение, которого нет у CSV. Ячейка CSV содержит текст и ничего больше; JSON различает числа, строки, логические значения и null. Кто-то должен решить, что есть что, и важны как раз те решения, в которых легко ошибиться: ведущий ноль значим в почтовом индексе, номере телефона или номере счёта, поэтому значение вроде 01234 должно остаться строкой, а не стать числом 1234. То же касается длинных идентификаторов, которые в виде чисел JSON теряют точность после примерно девяти квадриллионов.
Даты остаются текстом, каким были, потому что в JSON нет типа даты. 2024-03-05 выводится как строка "2024-03-05", и это честный ответ, а не ограничение: альтернатива — угадывать, а именно так 03/05/2024 становится мартом в одной стране и маем в другой. Их конвертация — решение для того, кто будет использовать JSON: он знает, какой формат ему нужен.
Кодировка — последняя незаметная ошибка. CSV никак не отмечает свою кодировку, поэтому файл, сохранённый в Windows-1252 и прочитанный как UTF-8, выдаёт кракозябры ровно в тех строках, где есть имена с диакритикой, — а маркер порядка байтов в начале, который добавляет Excel, если его не обработать, появляется лишними символами в названии первого поля. И то и другое — свойства CSV, а не какого-то конвертера.
Если нужно другое
Для файлов, слишком больших для памяти, или для всего, что делается скриптами, создан csvkit: csvjson --stream data.csv конвертирует по частям, csvlook позволяет сначала посмотреть, что у вас есть, а csvclean исправляет неровные строки, которые ломают всё дальше по цепочке. Miller — mlr --icsv --ojson cat data.csv — делает то же самое с немалой скоростью и умеет JSON с записью на строку, который на самом деле и нужен большинству конвейеров данных.
Когда типы важнее удобства, выполняйте конвертацию в коде, объявляя типы, а не выводя их. pandas в Python с явным сопоставлением dtype или небольшой скрипт со схемой гарантируют, что почтовый индекс останется почтовым индексом, а идентификатор сохранит все цифры, — чего никакой автоматический вывод типов не гарантирует для файла, который он не видел целиком.
Частые вопросы
Какую структуру JSON выбрать?
Массив объектов — [{"name": "Ada", "age": 36}] — подходит почти для любого API и библиотеки. Массив массивов — самый компактный. Объект с ключами позволяет коду находить записи по ID. JSON Lines записывает по одной записи на строку — для потоковых инструментов, BigQuery и конвейеров логов.
Как определяются числа и логические значения?
Один раз для каждого столбца: столбец становится числовым, только если каждое значение в нём — число, поэтому "007" и 7 никогда не окажутся вперемешку под одним ключом. Значения с ведущими нулями и ID, слишком длинные, чтобы JavaScript мог хранить их точно, остаются строками. true и false становятся логическими значениями, а пустые ячейки — null, пустыми строками или вообще пропускаются, как вам удобнее.
Можно ли создать вложенный JSON?
Да. Если включить вложенность, заголовок вида address.city превращается в {"address": {"city": …}}, а tags.0, tags.1 — в массив.
Мои данные где-нибудь сохраняются?
Нет. Ничего никуда не отправляется и ничего не сохраняется.
А точки с запятой, табуляции и другие кодировки?
Запятые, точки с запятой, табуляции и вертикальные черты определяются автоматически, как и UTF-8, UTF-16 и старые кодировки Windows, поэтому текст с диакритикой и не на латинице передаётся без искажений.
А повторяющиеся или пустые названия столбцов?
Повторы получают номер (name, name_2), а пустые заголовки — имя по позиции (column_3), так что ни одно значение не перезаписывается, и вам сообщается, что изменилось.
Полезно знать: Даты остаются текстом из вашего файла, потому что в JSON нет типа даты. Очень большие файлы ограничены памятью вашего браузера.
Разместите этот инструмент на своём сайте
Бесплатно для любого блога, страницы класса или справочной статьи. Вставьте один фрагмент кода — и посетители смогут пользоваться инструментом прямо на вашей странице.