Перейти к содержимому

Конвертировать CSV в JSON

Превратите CSV-файл или вставленную таблицу в чистый JSON — с типизированными числами и логическими значениями, вложенными объектами из заголовков с точками и ровно той структурой, которую ждёт ваш код.

  • Не сохраняется
  • Без очереди и ожидания
  • Без регистрации и водяных знаков

Как это работает

1

Добавьте CSV

Перетащите файл .csv или .tsv либо вставьте данные. Разделитель и кодировка определяются автоматически.

2

Выберите структуру

Массив объектов, массив массивов, объект с ключами из первого столбца или JSON Lines — а также типы, пустые значения и отступы.

3

Скопируйте или скачайте

Скопируйте 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 нет типа даты. Очень большие файлы ограничены памятью вашего браузера.

Разместите этот инструмент на своём сайте

Бесплатно для любого блога, страницы класса или справочной статьи. Вставьте один фрагмент кода — и посетители смогут пользоваться инструментом прямо на вашей странице.