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