JSON в CSV

Преобразуйте массив объектов JSON в CSV по RFC 4180. Раскрывает вложенные объекты в столбцы с точками, обрабатывает разреженные записи и предлагает разделители запятая, точка с запятой, табуляция или вертикальная черта, а также BOM для Excel.

Превратите записи в таблицу. Вставьте массив объектов и получите CSV со строкой заголовков. Вложенные объекты становятся именами столбцов с точками, отсутствующие поля - пустыми ячейками, а значения, содержащие разделитель, заключаются в кавычки согласно RFC 4180.

Превращаем дерево в таблицу

Несовпадение форм

JSON - это дерево, а CSV - прямоугольник, поэтому при любом преобразовании нужно решить, что делать с частями дерева, которые не помещаются. Форма, которая отображается чисто, - это массив плоских объектов: каждый объект становится строкой, а каждый ключ - столбцом. Всё остальное требует правила.

Вложенные объекты - простой случай. {"role": {"team": "core"}} становится столбцом с именем role.team, что сохраняет адресуемость значения и понятно большинству мастеров импорта таблиц. Вложенные массивы сложнее, потому что их раскрытие изменило бы число строк и незаметно продублировало окружающие данные. Этот конвертер оставляет их как текст JSON в одной ячейке - это теряет возможность запросов, но никогда не создаёт записей, которых не было в источнике.

Разреженные записи и порядок столбцов

Реальный JSON редко однороден. В одной записи есть nickname, в следующей - нет; поле появляется только после некоторой даты миграции. Конвертер, который брал бы столбцы только из первого объекта, незаметно отбросил бы всё остальное.

Список столбцов здесь - это объединение всех ключей по всем записям в порядке первого появления. Записи без поля получают пустую ячейку, а не пропускаются, поэтому число строк всегда совпадает с длиной ввода. Порядок первого появления выбран вместо алфавитного, потому что он сохраняет задуманную автором группировку - id и name остаются в начале, а не разбросанными.

Кавычки, разделители и Excel

RFC 4180 требует заключать поле в кавычки, если оно содержит разделитель, двойную кавычку или перенос строки, а вложенная кавычка экранируется её удвоением. Этот инструмент применяет это правило к каждой ячейке, включая заголовок, поэтому такое значение, как Grace, Jr., или многострочный адрес переживут круговой обход через любой совместимый парсер.

Выбор разделителя важнее, чем кажется. В регионах, где запятая - десятичный разделитель (бóльшая часть континентальной Европы), Excel ожидает точку с запятой и иначе сбрасывает всю строку в столбец A. Опция BOM добавляет метку порядка байтов UTF-8, которая говорит Excel в Windows читать файл как UTF-8 вместо устаревшей кодовой страницы; без неё не-ASCII-имена приходят искажёнными. Обе опции выключены по умолчанию именно потому, что ломают другие инструменты, поэтому включайте их только для Excel.

Примечание об открытом ПО: реализовано на чистом JavaScript без сторонних библиотек.

Часто задаваемые вопросы

Какую форму ввода он ожидает?
Массив объектов, где каждый объект - одна строка. Одиночный объект допускается и даёт одну строку, но массив строк или чисел нельзя превратить в таблицу.
Как обрабатываются вложенные объекты?
Они раскрываются в имена столбцов с точками, поэтому {"role": {"team": "core"}} становится столбцом с именем role.team. Отключите раскрытие, чтобы оставить их как текст JSON.
Почему вложенные массивы остаются как JSON?
Их раскрытие изменило бы число строк и продублировало окружающие поля. Сохранение их в одной ячейке означает, что на выходе всегда ровно столько строк, сколько записей было на входе.
Что происходит, когда у записей разные ключи?
Заголовок - это объединение всех ключей по всем записям в порядке первого появления, а любая запись без поля получает пустую ячейку. Ни одна запись не пропускается.
Когда использовать опцию BOM?
Только для Excel в Windows. Метка порядка байтов говорит ему читать файл как UTF-8; без неё не-ASCII-символы считываются неверно. Другие инструменты могут показать BOM как лишние символы.
Почему мой файл открывается в один столбец в Excel?
Excel следует разделителю списка вашей локали. В регионах, где запятая используется как десятичный знак, он ожидает точку с запятой, поэтому переключите разделитель на точку с запятой и откройте снова.