Как работает конвертация
JSON в CSV: каждый объект массива становится строкой. Столбцы — это все ключи, которые встречаются в любом объекте, в порядке первого появления, поэтому у объекта без ключа получается пустая ячейка. Вложенные объекты разворачиваются в столбцы с точкой, например host.name, а массивы записываются текстом JSON в одну ячейку, потому что список не помещается в один столбец таблицы. Числа сохраняются в точности как записаны, поэтому длинные ID не округляются.
Кавычки соответствуют RFC 4180, стандарту CSV: значение, содержащее разделитель, двойную кавычку или перевод строки, берётся в двойные кавычки, а кавычка внутри него удваивается. Остальные значения остаются как есть. Выберите точку с запятой, если ваша таблица использует запятую для десятичных дробей, как Excel во многих европейских странах.
CSV в JSON: разборщик понимает поля в кавычках, удвоенные кавычки, переводы строк внутри кавычек и окончания строк CRLF, LF и CR. Разделитель определяется по первым строкам: выбирается тот, который делит их на одинаковое число полей. Если есть строка заголовков, получается по объекту на строку; без неё — по массиву на строку. Типизация превращает 42, 3.5, true, false и null в значения JSON, но оставляет 007 и очень длинные числа текстом, поэтому почтовые индексы и ID сохраняются.
Пример
Два сервера: у одного вложенный объект host и список портов, у другого нет IP-адреса, а в примечании есть запятая:
[
{ "id": 1, "host": { "name": "web-1", "ip": "203.0.113.10" }, "ports": [80, 443] },
{ "id": 2, "host": { "name": "db-1" }, "note": "primary, eu" }
]Столбцы — объединение всех ключей. host превращается в host.name и host.ip, массив ports остаётся текстом JSON и берётся в кавычки, потому что содержит запятую, отсутствующие IP и порты — пустые ячейки, а примечание берётся в кавычки из-за запятой:
id,host.name,host.ip,ports,note
1,web-1,203.0.113.10,"[80,443]",
2,db-1,,,"primary, eu"
Обратная конвертация этого CSV с включёнными типами и вложенностью снова даёт объекты. id снова число, host — объект, но ports возвращаются текстом «[80,443]», а пустые ячейки — пустыми строками, потому что ячейка CSV не может сообщить, что была списком или отсутствовала:
[
{"id":1,"host":{"name":"web-1","ip":"203.0.113.10"},"ports":"[80,443]","note":""},
{"id":2,"host":{"name":"db-1","ip":""},"ports":"","note":"primary, eu"}
]Вопросы
Как преобразовать JSON в CSV?
Вставьте JSON выше или откройте файл .json, оставьте выбранным «JSON → CSV» и выберите разделитель. CSV сразу появится вместе с предпросмотром таблицей; скопируйте его или скачайте файлом .csv и откройте в Excel, Google Sheets или LibreOffice. JSON должен быть массивом объектов, но подойдут и один объект, и ответ API с одним массивом внутри, и JSON Lines.
Как преобразовать CSV в JSON?
Переключите направление на «CSV → JSON», затем вставьте CSV или откройте файл .csv. Разделитель определяется автоматически. Если первая строка — названия столбцов, каждая строка становится объектом; отключите это, чтобы получить массивы. Включите типизацию, чтобы получать числа и true или false вместо строк, и вложенность, чтобы столбцы вроде server.cpu снова превращались в объекты.
Что происходит с вложенными объектами и массивами JSON?
Вложенные объекты разворачиваются в столбцы с точкой: объект host с полем name становится столбцом host.name, на любую глубину. Массивы записываются текстом JSON в одну ячейку, например [80,443], потому что у списка нет естественного места в одной ячейке. Отключите разворачивание, чтобы вложенные объекты тоже оставались текстом JSON.
Почему Excel помещает мой CSV в один столбец или портит буквы?
Excel использует разделитель списков вашей системы: там, где десятичным знаком служит запятая, как в Германии или Франции, он ожидает точки с запятой. Выберите здесь «Точка с запятой», и столбцы разделятся. Искажённые буквы означают, что Excel прочитал файл в старой кодовой странице вместо UTF-8; отметьте метку порядка байтов перед скачиванием или импортируйте файл через «Данные → Из текста/CSV» и выберите UTF-8.
Как преобразовать JSON в CSV в командной строке?
С помощью jq, для массива плоских объектов: jq -r '(.[0] | keys_unsorted) as $k | $k, (.[] | [.[$k[]]]) | @csv' data.json > data.csv. Столбцы берутся только из первого объекта. Для CSV в JSON Python не требует дополнительных пакетов: python3 -c "import csv,json,sys; print(json.dumps(list(csv.DictReader(sys.stdin))))" < data.csv.