CSV в JSON: как сохранить ведущие нули и не угадать типы ошибочно

Не угадывать типы; явный header/delimiter и quoting

Сетка превращается в отдельные цепочки как образ чтения CSV в JSON

В CSV одинаково выглядят число, код, дата и обычный текст. Значение 001 может быть идентификатором, а true — надписью. Поэтому Neraviko при преобразовании CSV в JSON сохраняет каждую ячейку строкой. Это предсказуемая исходная точка для дальнейшего импорта.

Выберите форму результата

Откройте CSV → JSON. Если первая запись содержит имена колонок, оставьте header=true: получится массив объектов. Если первая запись уже содержит данные, установите header=false: получится массив массивов. Ошибка в этой настройке либо съест первую запись, либо превратит заголовок в данные.

Разделитель выбирается явно: comma, semicolon, tab или pipe. Посмотрите исходный текст, а не только имя файла. Расширение .csv не сообщает, какой символ использовал отправитель. Не заменяйте разделитель массовой заменой: тот же знак может встречаться внутри правильно заключённого в кавычки поля.

Проверенный пример со строковыми значениями

Синтетический вход:

code;active;price
001;true;1.50
002;false;0

Настройки: delimiter=semicolon, header=true, pretty=false, trailing_newline=false. Ожидаемый результат операции csv.to_json:

[{"code":"001","active":"true","price":"1.50"},{"code":"002","active":"false","price":"0"}]

Пример проверен локальным вызовом операции версии 1. Кавычки вокруг true существенны: это строка, не JSON boolean. 1.50 сохраняет два знака после точки как исходный текст. Если получателю нужны числа, преобразуйте конкретную колонку по её контракту уже после проверки. Идентификатор code при этом должен остаться строкой.

При header=false тот же файл с удалённым заголовком станет:

[["001","true","1.50"],["002","false","0"]]

Это другая структура. Получатель должен знать значения позиций 0, 1 и 2; имена колонок в ней отсутствуют.

Кавычки, пустые строки и переносы

Парсер поддерживает поля в двойных кавычках, удвоенные внутренние кавычки, пустые ячейки и UTF-8 BOM в начале. Разделитель и перенос внутри заключённого в кавычки поля не создают новую колонку или запись. Основные правила кавычек описаны в RFC 4180, раздел 2, октябрь 2005; источник проверен 05.10.2026.

Для переводов записей поддерживаются CRLF, LF и CR. Важная граница текущей реализации: переводы строк внутри поля нормализуются в LF. Смысл многострочного текста остаётся, но исходные байты CRLF не сохраняются. Если проверяете цифровую подпись исходного файла или байтовую идентичность, сохраните оригинал отдельно.

skip_empty_lines=true пропускает пустые физические строки между записями. Это не то же самое, что запись с пустыми ячейками. Для файла без заголовка различие особенно важно: пропуск строки может менять количество записей. Выбирайте настройку согласно договорённости с отправителем.

Проверьте файл без данных и запись с пустыми полями

Корректный файл, содержащий только заголовок, даёт пустой JSON-массив. Такой результат отличается от записи, в которой все ячейки пусты. Приёмка должна проверять, допустим ли пустой набор в вашей задаче, а не только то, что JSON успешно разобран. Синтаксическая конвертация не подтверждает наличие полезных записей.

Если данные начинаются с пустого поля, разделитель в начале записи сохраняет позицию этой ячейки. Не удаляйте его как «лишний»: иначе следующая ячейка сдвинется под другой заголовок. Аналогично последний разделитель обозначает пустую последнюю ячейку, когда этого требует ширина таблицы.

Для пробного импорта возьмите запись с заполненными значениями и запись с разрешёнными пустыми полями. Сверьте количество свойств каждого объекта и их буквальные имена. Затем повторите проверку с выключенным заголовком: структура меняется на позиционные массивы, поэтому ожидания импортёра нужно изменить явно. Это позволяет обнаружить ошибку режима до основной загрузки.

Не исправляйте неоднозначность молча

Одинаковые или пустые имена заголовков, разная ширина записей и незакрытые кавычки вызывают явную ошибку. Например, name,name возвращает DUPLICATE_CSV_HEADER, а запись из одной ячейки под заголовком из двух — INCONSISTENT_CSV_COLUMNS. Исправлять нужно исходный файл или контракт, а не отключать проверки.

Перед передачей результата проверьте:

  • есть ли заголовок и уникальны ли его имена;
  • совпадает ли выбранный разделитель с файлом;
  • сохранились ли ведущие нули, пробелы и пустые ячейки;
  • ожидает ли получатель строки, объекты или позиционные массивы;
  • совпало ли количество логических записей после конвертации.

Лимиты парсера: 5 000 записей включая строку заголовков, 256 колонок, 65 536 байт на поле. При header=true остаётся не более 4 999 строк данных. Лимит запроса — 262 144 байта, включая JSON-конверт и экранирование текста CSV. Операция выполняется на сервере. По контракту сырые входы и выходы операции не сохраняются и не попадают в логи по умолчанию; для знакомства с инструментом достаточно синтетического файла.