Русский

JSON в CSV из ответа API: как раскрыть вложенные поля и не сломать таблицу

Практический сценарий: превратить ответ API из JSON в CSV, раскрыть вложенные объекты и выбрать разделитель без отправки данных на сервер.

У вас есть ответ API из тикета, тело webhook или мок для теста. JSON читается, но менеджеру, аналитику или QA нужна таблица: открыть файл в Excel или Google Sheets, отфильтровать строки, посмотреть email, статус, дату и пару вложенных полей. Здесь легко получить CSV, который формально скачался, но неудобен в работе: половина данных спрятана в JSON-строках, часть колонок уехала из-за запятых, а вложенные массивы непонятно где искать.

Короткий рабочий порядок такой:

ШагЧто проверить
1JSON должен быть объектом или массивом, не отдельной строкой, числом, 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 или скрипт рядом с проектом.

Связанные инструменты