Форматы
Чем открыть JSON-файл
Как посмотреть и отредактировать обычный одиночный .json-файл: программы, браузер, онлайн-вьюеры.
Скачали датасет для обучения ИИ-модели, выгрузили лог сервиса или экспортировали данные из Elasticsearch — и получили файл с расширением .jsonl, который обычный JSON-валидатор открывать отказывается? Это не сломанный JSON, а отдельный формат со своими правилами. Разбираем, что такое JSONL (JSON Lines), чем он принципиально отличается от обычного JSON, где он реально применяется и как его открыть, посмотреть и провалидировать. Если вам нужен не построчный JSONL, а обычный одиночный JSON-файл — смотрите отдельный разбор чем открыть JSON-файл.
Коротко: JSONL (JSON Lines) — это текстовый формат, где каждая строка файла представляет собой отдельный, самостоятельный JSON-объект без общих скобок и запятых между строками. Такой файл можно читать построчно, не загружая целиком в память, поэтому его используют для логов, больших датасетов и обучающих данных ИИ-моделей (например, в fine-tuning OpenAI).
JSONL (JSON Lines, он же NDJSON — newline-delimited JSON) — это текстовый формат хранения данных, в котором каждая строка файла является отдельным, полностью валидным значением JSON. Строки не обёрнуты в общий массив [...] и не разделены запятыми, как элементы обычного JSON-массива, — каждая живёт сама по себе.
Файл кодируется в UTF-8, а строки разделяются обычным символом перевода строки \n. Расширение файла обычно .jsonl, но встречается и .ndjson — оба обозначают один и тот же принцип построчного JSON, просто разные проекты исторически выбрали разные имена.
Обычный файл .json — это один документ: единственный объект {...} или массив [...], который нужно разобрать целиком, прежде чем из него можно что-то достать. JSONL устроен принципиально иначе — это набор независимых записей, выстроенных одна под другой.
| Признак | JSON | JSONL |
|---|---|---|
| Структура | Один документ: объект или массив | Много независимых строк-записей |
| Валидность как единое целое | Весь файл — один валидный JSON-документ | Файл целиком НЕ является одним JSON-документом |
| Устойчивость к повреждению | Одна ошибка синтаксиса ломает разбор всего файла | Повреждена одна строка — остальные разбираются независимо |
| Чтение из памяти | Нужно загрузить весь файл, прежде чем начать разбор | Можно читать и обрабатывать по одной строке подряд |
Нет — если скормить файл .jsonl целиком обычному JSON-валидатору или парсеру, он вернёт ошибку. Причина в самой структуре: валидатор ожидает один документ, а видит несколько отдельных JSON-значений подряд без общей обёртки. Это не повреждённый файл и не ошибка экспорта — так формат и задуман. Чтобы прочитать JSONL правильно, нужно разбирать его построчно: каждую строку — отдельным вызовом JSON-парсера.
Откройте файл в текстовом редакторе. Если первая строка начинается с { и заканчивается на }, а на следующей строке снова начинается с { — это JSONL. Если весь файл — это один большой объект или массив, растянутый на много строк из-за форматирования, — это обычный JSON.
У формата всего три правила, и все они простые:
\n, без запятых между ними.Пример файла из трёх строк с данными о пользователях:
{"id": 1, "name": "Анна", "role": "editor"}
{"id": 2, "name": "Игорь", "role": "admin"}
{"id": 3, "name": "Мария", "role": "viewer"}Каждая строка здесь — самостоятельный, полностью корректный JSON-объект. Обычным JSON-массивом с теми же данными был бы один документ вида [{...}, {...}, {...}] — с квадратными скобками снаружи и запятыми между объектами.
Главное практическое преимущество JSONL — потоковая обработка. Обычный JSON требует загрузить весь файл в память, прежде чем парсер сможет вернуть хотя бы одну запись: пока не закрылась последняя скобка документа, разбор не завершён. JSONL читается иначе — построчно, с постоянным расходом памяти: можно обрабатывать файлы в десятки гигабайт, не загружая их целиком в оперативную память.
Отсюда и второе преимущество — независимость строк. Если одна строка в середине файла повреждена или обрезана, остальные всё равно разбираются парсером без проблем: сбой локализован, а не роняет чтение всего файла, как это бывает с единым JSON-документом.
JSONL — не нишевый формат «для энтузиастов»: он встроен в несколько распространённых систем именно потому, что потоковая построчная обработка там нужна по делу.
JSONL — единственный поддерживаемый формат обучающих датасетов для fine-tuning и Batch API OpenAI: каждая строка файла — отдельный пример для обучения, обычно объект с полем messages. Такая построчная структура удобна и для подготовки датасета (можно добавлять примеры по одному, не пересобирая весь файл), и для его проверки. JSONL — один из стандартных форматов и для построчных датасетов на платформах вроде Hugging Face.
Системы логирования часто пишут события построчно — каждое новое событие дописывается в конец файла отдельной строкой, без необходимости переписывать уже записанные данные. Это естественно ложится на структуру JSONL и упрощает потоковую передачу логов между сервисами.
Bulk API Elasticsearch принимает тело запроса именно в формате NDJSON: чередующиеся строки с действием/метаданными и строки с самими данными, тип содержимого application/x-ndjson или application/json, а финальная строка обязана заканчиваться переводом строки. При этом JSON внутри строк не должен быть pretty-printed — иначе построчный парсер Bulk API собьётся.
Превратить обычный JSON-массив в JSONL несложно: нужно разложить каждый элемент массива в отдельную строку файла, убрав внешние квадратные скобки и запятые между объектами. Обратное преобразование — из JSONL в JSON-массив — делается так же: строки оборачиваются в [...] и разделяются запятыми.
Если под рукой оказался файл без расширения и непонятно, JSONL это, обычный JSON или что-то совсем другое, — структуру и формат содержимого проще всего установить через гайд как определить формат файла без расширения или тот же инструмент «Определить формат файла» выше.
Попытка провалидировать весь файл как единый JSON — валидатор ожидает один документ и сразу вернёт ошибку синтаксиса, хотя с самими данными всё в порядке; проверяйте построчно.
Pretty-print внутри строк — если каждый JSON-объект отформатирован с переносами строк внутри себя, построчные парсеры (например, Bulk API Elasticsearch) перестают понимать, где заканчивается одна запись и начинается следующая. Каждая запись должна умещаться в одну строку.
Кодировка, отличная от UTF-8 — формат предполагает UTF-8; файл, сохранённый в другой кодировке, может содержать нечитаемые символы и ломать парсинг строк с не-ASCII текстом.
Лишние пустые строки — пустая строка — не валидный JSON-объект, и некоторые парсеры споткнутся об неё при построчном чтении, особенно в конце файла.
По сути ничем — это два названия одного и того же принципа построчного JSON (newline-delimited JSON). Расширение файла при этом может быть и .jsonl, и .ndjson — выбор зависит от конкретного инструмента или проекта.
Напрямую Excel построчный JSON не понимает. Проще всего сначала посмотреть содержимое в текстовом редакторе, а для табличного представления — импортировать данные через Power Query или сконвертировать JSONL в CSV сторонним инструментом.
Подойдёт любой текстовый редактор — от стандартного «Блокнота» до VS Code или Notepad++. Для удобного построчного просмотра с подсветкой синтаксиса лучше использовать редактор кода, а не простой текстовый редактор.
Потому что обычный валидатор JSON ожидает один документ на входе, а файл .jsonl содержит несколько независимых JSON-значений подряд. Это нормальное поведение формата, а не ошибка в файле — валидировать нужно построчно, а не весь файл целиком.
Достаточно соединить файлы построчно один за другим, сохранив перевод строки между последней строкой одного файла и первой строкой следующего. Поскольку каждая строка независима, порядок файлов при объединении не важен для корректности результата.
Готового отдельного модуля «из коробки» ни там, ни там нет, но оба языка легко работают с JSONL через стандартные средства: в Python — построчное чтение файла с разбором каждой строки модулем json, в JavaScript/Node.js — построчное чтение потока с разбором каждой строки через JSON.parse().