Пошаговые инструкции Для начинающих 15 мин

Как создать JSON-файл в n8n через Convert to File

Сохраните записи в один JSON-файл и прочитайте его обратно без потери типов. 12 шагов, готовый workflow, образец файла и проверка результата.

n8n JSON Convert to File

На вкладке JSON в n8n уже видны данные, но это ещё не файл, который можно скачать и передать другой системе. Создадим настоящий catalog-demo.json через Convert to File, прочитаем его обратно и сравним с исходными записями. В примере останутся ведущие нули в ID, кириллица, число 0, значение false и null.

Результат инструкции

Получится ручной workflow из семи узлов. Три учебные карточки товаров превратятся в один JSON-файл с массивом объектов. После проверки файла Extract from File прочитает массив в поле rows, а последняя проверка выдаст count: 3 и roundtrip: true. Сам файл останется доступен в Binary и на последнем узле.

Нейросеть, API-ключи и внешние сервисы не нужны. Мы не отправляем файл в CRM, не меняем каталог и не настраиваем автоматическую публикацию. Проверка roundtrip означает совпадение с переданными исходными записями, а не правильность цен, остатков или других фактов в них.

Что понадобится

  • Работающий n8n и отдельный новый workflow. Проверено на n8n 2.42.4, Convert to File 1.1 и Extract from File 1.1.
  • Code на JavaScript для учебного источника и проверок. Преобразование в файл и чтение выполняют штатные узлы n8n.
  • Вымышленные данные из этой статьи. Не подставляйте пароли, API-ключи и персональные данные: содержимое файла и результаты выполнения могут сохраняться в n8n.

Установить n8n локально через Docker

Шаг 1. Импортируйте готовый workflow

Скачать n8n-json-file-roundtrip.json

Создайте новый workflow, выберите Import from File в меню редактора и загрузите скачанный JSON. Убедитесь, что схема содержит семь узлов в таком порядке:

text
Manual Trigger → Sample Rows → Check Rows → Make JSON
Make JSON → Check File → Read JSON → Verify Roundtrip

Make JSON — переименованный Convert to File, Read JSON — Extract from File. Sample Rows, Check Rows, Check File и Verify Roundtrip — узлы Code. Workflow неактивен, не содержит credentials и чужого ID. Для запуска по кнопке не нужны Schedule Trigger, Webhook и открытый вход из интернета.

В Settings оставьте On Error: Stop Workflow. Не включайте Continue On Fail, Always Output Data, Execute Once и Retry On Fail. Проверка должна останавливать неправильный экспорт, а не выдавать успешный результат с подставленным пустым объектом.

Шаг 2. Создайте три отдельных записи

В Sample Rows выберите Mode: Run Once for All Items, Language: JavaScript. Вставьте код:

javascript
const rows = [
  {"id":"001","title":"Блокнот","quantity":2,"active":true,"note":null,"tags":["офис","бумага"]},
  {"id":"002","title":"Чай «Утро»","quantity":0,"active":false,"note":"Проверить остаток","tags":[]},
  {"id":"003","title":"Папка A4","quantity":5,"active":true,"note":"Строка 1\nСтрока 2","tags":["архив"]}
];
return rows.map(json => ({ json }));

Выполните источник от Manual Trigger. На выходе Sample Rows должны быть три items. Каждый item содержит одну карточку, а не общий объект с полем rows. Это определяет форму будущего файла: общий режим Convert to File соберёт массив из этих трёх объектов.

ID намеренно записаны строками. Если превратить 001 в число 1 до экспорта, Convert to File не восстановит потерянные нули. Во второй записи количество равно нулю, active равно false, а массив tags пуст. Не заменяйте эти значения пустыми строками и не удаляйте их как «незаполненные».

Поле Тип в примере Что сохраняем
id Строка 001, а не число 1
quantity Число 0 не становится пустой строкой
active и note Boolean и строка либо null false и null остаются значениями
title и tags Строка и массив строк Кириллица, кавычки, пустой массив

Шаг 3. Проверьте поля до создания файла

В Check Rows задайте Run Once for All Items и JavaScript, затем вставьте:

javascript
const items = $input.all();
if (items.length < 1 || items.length > 20) throw new Error('row_count_invalid');
const ids = new Set();
for (const { json: row } of items) {
  if (Object.keys(row).sort().join('|') !== 'active|id|note|quantity|tags|title') {
    throw new Error('row_fields_invalid');
  }
  if (typeof row.id !== 'string' || !/^\d{3}$/.test(row.id) || ids.has(row.id)) {
    throw new Error('id_invalid_or_duplicate');
  }
  if (typeof row.title !== 'string' || !row.title.trim() || row.title.length > 100) {
    throw new Error('title_invalid');
  }
  if (!Number.isSafeInteger(row.quantity) || row.quantity < 0) throw new Error('quantity_invalid');
  if (typeof row.active !== 'boolean') throw new Error('active_invalid');
  if (row.note !== null && (typeof row.note !== 'string' || row.note.length > 200)) {
    throw new Error('note_invalid');
  }
  if (!Array.isArray(row.tags) || row.tags.length > 3 || row.tags.some(t => typeof t !== 'string' || !t.trim() || t.length > 30)) {
    throw new Error('tags_invalid');
  }
  ids.add(row.id);
}
return items.map(item => ({ json: item.json }));

На корректных данных проверка возвращает те же три записи. Она отклоняет неизвестные или отсутствующие поля, повтор ID, число вместо строкового ID, текст вместо количества, отрицательные и дробные количества. active должен быть настоящим boolean, note — строкой или null, tags — массивом строк.

Диапазон от 1 до 20 записей и ограничения длины выбраны для маленького учебного файла. Это не лимиты n8n. При замене источника нужно отдельно согласовать типы и объём; одного расширения .json недостаточно, чтобы данные соответствовали требованиям получателя.

Проверка не исправляет и не угадывает значения. Она также не пропускает binary из источника дальше. Если у вас есть дополнительные поля, сначала решите, нужны ли они в экспорте, затем осознанно измените договор данных. Не убирайте проверку целиком ради одного незнакомого поля.

Шаг 4. Соберите все items в один файл

В Make JSON выберите Operation: Convert to JSON. Настройте следующие поля:

Параметр Значение Зачем
Mode All Items to One File Один массив в одном файле
Put Output File in Field export Имя binary-поля, не JSON-поля
Options → File Name catalog-demo.json Имя скачиваемого файла
Options → Format On Отступы для чтения и точной проверки

Не выбирайте Each Item to Separate File: для трёх входных items этот режим создаст три выходных файла. Это полезный режим для другой задачи, но здесь нам нужен один общий каталог. Последующий Check File специально остановит схему, если получит больше одного файла.

Имя export вводится обычным текстом. В нём нет выражения со значением товара. Оно обозначает место хранения файла в item.binary.export. Имя catalog-demo.json задаётся отдельно: его нельзя подменять названием binary-поля.

Шаг 5. Зафиксируйте кодировку

В Options у Make JSON добавьте Encoding: utf8. Add Byte Order Mark (BOM) оставьте Off. Форматирование включите, как в предыдущем шаге. Так учебный файл имеет однозначные байты: UTF-8 без BOM, с отступами.

BOM — отдельный маркер в начале файла. В этой сборке он не нужен и будет отклонён проверкой. Это не утверждение, что любой JSON с BOM нельзя прочитать: просто мы зафиксировали один формат экспорта. Переключение Format на Off также не обязательно делает JSON неверным, но нарушает наш точный договор файла.

Не пытайтесь исправлять кириллицу выбором случайной кодировки. Источник уже содержит нормальные строки. При сохранении в UTF-8 и чтении в UTF-8 слова «Блокнот» и «Чай» должны сохраниться без искажений. Ручная замена русских букв escape-последовательностями для этого примера не нужна.

Шаг 6. Проверьте Binary у Make JSON

Запустите схему от Manual Trigger. В Make JSON ожидается один выходной item. Его JSON пустой, а на вкладке Binary есть поле export, имя catalog-demo.json и MIME type application/json. Пустой объект на вкладке JSON здесь не означает, что файл потерян.

Откройте просмотр файла, если он доступен в вашей версии редактора, или скачайте его из Binary. Содержимое начинается с квадратной скобки и содержит три объекта. Ниже приведён точный учебный файл, без добавленного переноса строки в конце:

json
[
  {
    "id": "001",
    "title": "Блокнот",
    "quantity": 2,
    "active": true,
    "note": null,
    "tags": [
      "офис",
      "бумага"
    ]
  },
  {
    "id": "002",
    "title": "Чай «Утро»",
    "quantity": 0,
    "active": false,
    "note": "Проверить остаток",
    "tags": []
  },
  {
    "id": "003",
    "title": "Папка A4",
    "quantity": 5,
    "active": true,
    "note": "Строка 1\nСтрока 2",
    "tags": [
      "архив"
    ]
  }
]

Если передать в Convert to File один item вида {rows: [...]}, получится массив с одним объектом, внутри которого лежит rows. Это другая структура. В нашей схеме до Make JSON идут три самостоятельных items, поэтому дополнительной обёртки rows в файле нет.

Шаг 7. Проверьте сам файл

В Check File выберите Run Once for All Items и JavaScript. Вставьте:

javascript
const items = $input.all();
if (items.length !== 1) throw new Error('one_file_required');
const item = items[0];
if (Object.keys(item.binary ?? {}).join('|') !== 'export') throw new Error('export_binary_required');
if (item.binary.export.fileName !== 'catalog-demo.json') throw new Error('file_name_invalid');
const bytes = await this.helpers.getBinaryDataBuffer(0, 'export');
if (bytes.length < 1 || bytes.length > 16384) throw new Error('file_size_invalid');
if (bytes[0] === 239 && bytes[1] === 187 && bytes[2] === 191) throw new Error('bom_not_expected');
const text = bytes.toString('utf8');
if (!Buffer.from(text, 'utf8').equals(bytes)) throw new Error('utf8_invalid');
const expected = $('Check Rows').all().map(i => i.json);
if (text !== JSON.stringify(expected, null, 2)) throw new Error('file_content_mismatch');
return [{ json: {}, binary: item.binary }];

Код читает реальные байты binary через helper n8n. Нельзя считать item.binary.export.data готовым текстом: в файловом режиме там может находиться ссылка на хранилище. Проверка работает с содержимым файла, а не с внешним видом карточки Binary.

Нужны ровно один item, одно binary-поле export, согласованное имя, размер от 1 до 16384 байт, UTF-8 без BOM и точное совпадение с сериализацией Check Rows. Проверка не создаёт файл сама: его уже сформировал Convert to File. После проверки binary передаётся дальше.

Сравнение с Check Rows позволяет менять учебные карточки, не переписывая эталон вручную. Но это не независимая проверка источника: если неправильное значение пришло в Check Rows и соответствует его правилам, экспорт честно сохранит это неправильное значение.

Шаг 8. Прочитайте JSON обратно

В Read JSON выберите Operation: Extract From JSON. Задайте Input Binary Field: export, Destination Output Field: rows. В Options установите File Encoding: utf8, Strip BOM: On, Keep Source: Binary.

После выполнения ожидается один item, внутри json.rows — массив из трёх объектов. Сам массив автоматически не становится тремя items. При этом исходный файл остаётся в binary.export благодаря Keep Source: Binary. Не ищите его в json.export.

Read JSON — это не распознавание текста нейросетью. Узел разбирает JSON-файл. Если выбрать Extract From Text File, вы получите строку, а не массив объектов, и следующая проверка остановит workflow. Если выбрать неправильное Input Binary Field, узел не найдёт файл.

Шаг 9. Сравните результат с исходными записями

В Verify Roundtrip задайте Run Once for All Items, JavaScript и вставьте:

javascript
const items = $input.all();
if (items.length !== 1) throw new Error('one_result_required');
const rows = items[0].json.rows;
const expected = $('Check Rows').all().map(i => i.json);
if (!Array.isArray(rows) || JSON.stringify(rows) !== JSON.stringify(expected)) {
  throw new Error('roundtrip_mismatch');
}
if (!items[0].binary?.export) throw new Error('download_file_missing');
return [{
  json: { file_name: 'catalog-demo.json', count: rows.length, roundtrip: true, action: false },
  binary: items[0].binary
}];

После полного запуска на вкладке JSON последнего узла должно получиться:

json
{
  "file_name": "catalog-demo.json",
  "count": 3,
  "roundtrip": true,
  "action": false
}

Проверка сравнивает весь массив, порядок записей и значения, включая вложенный tags. В этом примере порядок ключей тоже остаётся тем же. Для произвольных чужих JSON-файлов равенство строк JSON.stringify не является универсальным семантическим сравнением; здесь мы проверяем результат конкретной связки собственных узлов.

На вкладке Binary последнего узла должен оставаться export. Поле action: false означает, что мы не настроили отправку или изменение каталога. Оно не означает отсутствия файлового хранения внутри n8n: binary и данные выполнения могут храниться на диске экземпляра.

Шаг 10. Скачайте результат

Откройте Binary у Verify Roundtrip и скачайте export. Ожидаемое имя — catalog-demo.json. Откройте файл обычным редактором с UTF-8 и проверьте три объекта, ID 001, нулевое quantity у второй карточки, false, null, пустой tags и перенос строки внутри note третьей карточки. В исходнике JSON этот перенос записан как \n.

Скачать эталонный catalog-demo.json

Эталон нужен для сравнения исходного примера, он не загружается в workflow автоматически. Если вы поменяли карточки, файл закономерно будет отличаться от этого образца. Сначала верните Sample Rows из шага 2, если хотите сравнить файлы побайтно.

Скачивание через Binary сохраняет файл на ваш компьютер. Наш workflow не использует Read/Write Files from Disk и не записывает catalog-demo.json в папку проекта на сервере. Настройки внутреннего binary-хранилища и ручная загрузка файла в браузере — разные вещи.

Шаг 11. Проверьте изменения без потери типов

Временно измените quantity у первого товара с 2 на 3. Выполните всю цепочку: ожидается count: 3, roundtrip: true, а в файле — новое число 3. Верните исходное значение. Затем переставьте карточки: они должны сохраниться в новом порядке, проверка должна пройти.

Оставьте в Sample Rows только одну карточку. Результат должен иметь count: 1, но содержимое файла всё равно является массивом с одним объектом, а не одиночным объектом. После этого восстановите три записи.

Проверьте false, 0, null и пустой tags: это четыре разных значения. Не используйте при подготовке данных условие вида «если значение ложное, заменить пустой строкой». Оно потеряет часть информации ещё до создания файла, и обратное чтение уже не поможет.

Шаг 12. Проверьте ошибки и пустой источник

Замените quantity на строку "2". Check Rows должен остановиться с quantity_invalid. Верните число. Повторите ID 001 у второй карточки: ожидается id_invalid_or_duplicate. После теста восстановите исходные ID.

В Make JSON временно выберите Each Item to Separate File. Check File должен остановиться с one_file_required. Затем верните All Items to One File. Измените Destination Output Field у Read JSON с rows на other: Verify Roundtrip должен остановиться с roundtrip_mismatch. Верните rows и выполните исходную схему ещё раз.

Отдельный случай: если Sample Rows вернёт [], он выдаст ноль items. В проверенной версии последующие узлы не выполнятся, файл не появится, хотя выполнение может иметь статус success. Это не экспорт пустого JSON-массива. В этой инструкции нужен хотя бы один item; сценарий явного файла [] требует отдельной ветки и отдельной проверки.

Не включайте Always Output Data, чтобы скрыть пустой источник: искусственный item с пустым объектом не равен массиву без записей. Для реальной интеграции сначала выясните, источник действительно пуст или данные не загрузились. Итоговая проверка исходного примера: три items до Make JSON, один файл после, массив из трёх объектов после Read JSON и roundtrip: true в конце.

Если результат отличается

Симптом Что проверить Правильное состояние
one_file_required Mode у Make JSON All Items to One File
export_binary_required Put Output File in Field export
file_content_mismatch Format и входные данные Format On, три отдельных items
roundtrip_mismatch Operation и Destination у Read JSON Extract From JSON, rows
success, но файла нет Выход Sample Rows Не ноль items

Перед подключением реальных данных

Не добавляйте автоматическую загрузку в рабочую CRM или каталог сразу после успешного теста. Сначала согласуйте схему файла с получателем, ограничения размера, обработку пустого источника и способ проверки перед импортом. Дополнительные поля и персональные данные не должны попадать в экспорт случайно.

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

Проверить SHA-256 файла в n8n

Разделить массив на отдельные items через Split Out

Создать CSV вместо JSON

Что проверено редакцией

17 октября 2026 года workflow проверен на n8n 2.42.4 в отдельном Docker-экземпляре с binary-режимом filesystem ручными запусками API. Все 35 тестов прошли: основной пример, другой порядок, одна и двадцать записей, Unicode, пустая строка, массивы, нули, false и null; дубли, неверные поля и типы; отдельные файлы вместо общего, другое binary-поле, имя, форматирование, BOM и UTF-16; неверные настройки чтения, удаление binary и изменение прочитанных данных. Отдельно подтверждено, что ноль входных items не создаёт файл. Основной запуск использует точный скачиваемый workflow. Байты реально созданного файла совпали с опубликованным catalog-demo.json. Настройки сверены с официальной документацией и кодом узлов. Редакторские клики, ручное скачивание через браузер, Cloud, реальные каталоги, большие файлы и внешняя отправка не тестировались. Учебный контейнер остановлен, существующие workflows не менялись. Обложка — редакционная AI-иллюстрация с фрагментом JSON, не снимок реального интерфейса.

Частые вопросы

Почему на вкладке JSON пустой объект?

Convert to File поместил файл в binary.export. Смотрите вкладку Binary. После Read JSON данные снова появятся в JSON, внутри поля rows.

Почему получилось три файла вместо одного?

В Make JSON выбран Each Item to Separate File. Для общего массива нужен All Items to One File. Check File в этой инструкции отклоняет несколько файлов.

Сохранятся 001, false, 0 и null?

Да, если они пришли с правильными типами: ID строкой, false boolean, 0 числом и null отдельным значением. Потерянные до экспорта ведущие нули узел не восстановит.

Почему при пустом источнике нет файла?

Ноль items не означает один item с пустым массивом. В проверенном workflow последующие узлы не выполняются. Явный экспорт [] нужно проектировать отдельно.

Это уже резервная копия базы?

Нет. Мы сохранили только переданные учебные записи. Здесь нет проверки полноты базы, истории версий, восстановления и автоматической передачи получателю.

Дальше по теме

Похожие материалы