JSON в CSV из ответа API: как раскрыть вложенные поля и не сломать таблицу
Практический сценарий: превратить ответ API из JSON в CSV, раскрыть вложенные объекты и выбрать разделитель без отправки данных на сервер.
У вас есть ответ API из тикета, тело webhook или мок для теста. JSON читается, но менеджеру, аналитику или QA нужна таблица: открыть файл в Excel или Google Sheets, отфильтровать строки, посмотреть email, статус, дату и пару вложенных полей. Здесь легко получить CSV, который формально скачался, но неудобен в работе: половина данных спрятана в JSON-строках, часть колонок уехала из-за запятых, а вложенные массивы непонятно где искать.
Короткий рабочий порядок такой:
| Шаг | Что проверить |
|---|---|
| 1 | JSON должен быть объектом или массивом, не отдельной строкой, числом, boolean или null |
| 2 | Сначала прогоните JSON через JSON formatter, если есть сомнение в синтаксисе |
| 3 | В JSON в CSV выберите разделитель под целевую таблицу |
| 4 | Проверьте названия колонок после раскрытия вложенности: profile.name, items[0].sku, tags[1] |
| 5 | Если файл большой или нужен повторяемый ETL, переносите правило в jq, Python или pipeline |
Какая форма JSON нормально ложится в CSV
CSV - плоская таблица: строка заголовков и строки данных. JSON - дерево. Поэтому лучше всего конвертируются массивы объектов:
[
{
"id": 42,
"email": "ada@example.com",
"profile": { "role": "admin", "team": "platform" }
},
{
"id": 43,
"email": "linus@example.com",
"profile": { "role": "dev", "team": "kernel" }
}
]
Такой JSON станет несколькими строками. Одиночный объект тоже поддерживается, просто получится одна строка. А вот корневое значение "ok", 123, true или null не превращается в таблицу без искусственной колонки. Devdeck в таком случае показывает ошибку, а не придумывает структуру за вас.
Если API возвращает обёртку вроде { "data": [...], "meta": {...} }, посмотрите на результат внимательно. Конвертер раскроет весь объект как одну строку: появятся колонки вроде data[0].id, data[1].id и meta.total, а не отдельная строка на каждый элемент data. Для чистой таблицы часто лучше взять именно массив из data, а не весь ответ.
Что значит flatten вложенных полей
Вложенные объекты и массивы не исчезают. Devdeck раскрывает их в колонки с путями:
| JSON поле | CSV колонка |
|---|---|
{ "profile": { "name": "Ada" } } | profile.name |
{ "tags": ["admin", "beta"] } | tags[0], tags[1] |
{ "items": [{ "sku": "A1" }] } | items[0].sku |
{ "extra": {} } | extra со значением {} |
{ "flags": [] } | flags со значением [] |
Это удобно для ответов API, где нужно быстро увидеть отдельные вложенные поля в электронной таблице. Но это не полноценная нормализация данных. Если в одном заказе 10 товаров, а в другом 2, CSV получит колонки items[0]...items[9], а часть ячеек останется пустой. Для отчёта с отдельной строкой на товар лучше писать небольшой преобразователь, а не ждать от универсального конвертера правильную бизнес-модель.
Разделитель: запятая, точка с запятой, tab или pipe
CSV не обязан быть только через запятую. В devdeck можно выбрать comma, semicolon, tab или pipe. Если файл пойдёт в Excel с русской/европейской локалью, точка с запятой часто открывается спокойнее. Для вставки в Google Sheets или временного копирования между таблицами tab иногда удобнее, потому что меньше конфликтует с обычным текстом.
Значения экранируются по CSV-правилам: если внутри ячейки есть кавычка, перенос строки или выбранный разделитель, значение будет обёрнуто в двойные кавычки, а кавычки внутри удвоятся. Поэтому проблема "в email/адресе была запятая и всё поехало" должна решаться самим сборщиком CSV, а не ручной заменой символов.
Отдельная оговорка для пользовательских данных: Excel и Google Sheets могут воспринять значения, начинающиеся с =, +, - или @, как формулы. Devdeck экранирует CSV-структуру, но не санитизирует формулы в ячейках. Если CSV уйдёт наружу и внутри есть недоверенный текст, экранируйте такие поля в скрипте или pipeline перед публикацией.
Где здесь граница браузерного инструмента
JSON в CSV работает локально в браузере: JSON.parse, раскрытие полей и сборка CSV выполняются во вкладке. Это хорошо для ответа API из тикета, небольшого тела webhook, тестовых данных или ручного ETL-черновика.
Локальная обработка убирает загрузку на сервер инструмента, но не отменяет риски буфера обмена, расширений браузера и общих компьютеров. Если внутри боевой секрет или персональные данные, спокойнее использовать локальный CLI рядом с проектом. Подробнее про эту границу есть в статье про локальные инструменты разработчика.
Для 50 МБ JSON, боевого экспорта и регулярной интеграции лучше не мучить вкладку. Нужен CLI или код рядом с контрактом: jq, Python, Node-скрипт, dbt/ETL pipeline. Там можно явно решить, какие массивы разворачивать в строки, какие поля переименовывать, как приводить даты и что делать с отсутствующими значениями.
Если после CSV нужно вернуться обратно, используйте CSV в JSON, но не считайте это идеальным round-trip. CSV теряет типы: числа, boolean и даты становятся текстом, а null превращается в пустую ячейку, если вы отдельно не восстанавливаете схему.
Перед отправкой таблицы дальше проверьте четыре вещи: нужный массив выбран из ответа, вложенные поля оказались в понятных колонках, CSV открыт в целевой таблице с тем же разделителем, а недоверенный текст не превратится в формулы.
Вопросы
Можно ли конвертировать любой JSON в CSV?
Нет. У JSON должна быть табличная форма: корневой объект или массив. Корневые строки, числа, boolean и null devdeck отклоняет, потому что из них нельзя получить имена колонок.
Что происходит с вложенными объектами и массивами?
Devdeck раскрывает вложенные значения в колонки с путями: profile.name, items[0].sku, tags[1]. Пустые объекты и массивы сохраняются как {} и [].
JSON отправляется на сервер при конвертации?
Нет. Разбор JSON, раскрытие полей и сборка CSV выполняются в браузере. Для больших файлов вкладка может тормозить, тогда лучше взять jq или скрипт рядом с проектом.