Перейти к содержимому

1. Как выглядят данные в n8n

В этом уроке вы узнаете, как видит ваши данные n8n — чтобы понимать механику его работы

Итак, мы знаем, что n8n — это сервис автоматизации. Он передает данные от первого узла workflow до последнего в цепочке. Тем самым совершая полезные для нас действия.

О самих рабочих процессах мы поговорим в следующем уроке. А сейчас подробно остановимся на понятии данных. Мы узнаем про форматы данных в n8n, как выглядит их структура и как происходит их передача от узла к узлу.

JSON и Binary — два вида данных

Данные в n8n бывают двух видов: в формате JSON и Binary.

Первый формат, JSON, отвечает за передачу структурированных данных в текстовом виде. Он был разработан для работы с объектами языка Javascript, но потом стал независимым и популярным во многих других языках. Это один из основных способов для множества веб-сервисов обмениваться данными через API. Есть и другие виды форматирования данных для обмена между приложениями, например, XML.

Бинарные данные — это уже информация не в текстовом, а двоичном виде. С её помощью в n8n передаются, например, изборажения. Или информация, прочитанная из файла. О бинарных данных мы поговорим дальше в курсе, когда будем изучать работу с файлами.

В нашем курсе мы в основном будем работать именно с данными в формате JSON, а не с бинарными данными. Представление JSON вы видите на правой Панели результатов вашего узла, во вкладке JSON.

И для начала давайте разберемся, что такое JSON, и как работать с этим форматом.

Что такое JSON?

Запись JSON, её еще называют JSON-объектом, можно представить как набор характеристик какого-то физического объекта. Например, имя, рост, возраст человека, курит ли он.

📖

JSON-объект

Формально, JSON-объект представляет собой набор пар “Ключ”-“Значение”. Каждая такая пара перечисляется через запятую, а сам объект заключается в фигурные скобки.

Давайте покажем JSON-объект на примере человека, которого зовут Ян. Ему 27 лет, он не курит, у него есть собака Чарли и хомяк Никсон, а ездит он на красном Chevrolet Camaro. Давайте посмотрим, как эта запись будет выглядеть в JSON-формате.

Начнём с пустого объекта — фигурных скобок, между которыми ничего нет. В записи JSON для читаемости фигурные скобки обычно находятся на отдельных строчках.

{
}

Теперь давайте добавим имя в этот объект. В самом простом варианте это будет выглядеть так:

{
  name: "Ян"
}

Видно, что здесь появилась новая строчка с информацией — свойство объекта. Чтобы легче читать, слева появляется отступ.

В левой части свойства находится его название name, а справа — значение “Ян”. В нашем случае это свойство типа строка, поэтому “Ян” заключено в кавычки.

В зависимости от контекста свойство еще можно называть ключом (когда речь идет о паре “ключ”-“значение”) или “полем” (когда мы говорим о табличном виде нескольких записей).

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

{
  "Имя /человека/": "Ян"
}

Поскольку на панели результатов вы будете видеть JSON-ключи в кавычках, то в этом примере мы также будем ставить их .

Давайте добавим возраст:

{
  "name": "Ян",
  "age": 27
}

При перечислении свойств они разделяются запятыми. Числовые значения кавычками не обрамляются.

Для значений логических свойств используются два слова: true — истина и false — ложь. Поскольку Ян не курит, получается вот так:

{
  "name": "Ян",
  "age": 27,
  "is_smoking": false
}

Теперь можно добавить информацию о его машине. Здесь напрашивается представить её в виде объекта со свойствами “модель” и “цвет”. Да, объекты могут выступать значениями свойств.

{
  "name": "Ян",
  "age": 27,
  "is_smoking": false,
  "car": {
    "model": "Chevrolet Camaro",
    "color": "красный"
  }
}

Наконец, вспомним, что у Яна есть питомцы. В этом случае нам поможем массив.

📖

Массив

Массив […] — это тоже набор данных, как объект, только он упорядоченный. В нем есть первый, второй, последний элемент. Массив может быть и пустым. Он может состоять из разнотипных данных — на первом месте строка, на втором — число, а на третьем месте — вообще объект. Элементы массива заключены между квадратными скобками.

У нас получится:

{
  "name": "Ян",
  "age": 27,
  "is_smoking": false,
  "car": {
    "model": "Chevrolet Camaro",
    "color": "красный"
  },
  "pets": [
    "Чарли", 
    "Никсон"
  ]
}

В массиве pets есть одна проблема — неясно, кто из них собака, а кто — хомяк. Чтобы это прояснить, вместо строк в массиве снова запишем объекты. И в свойстве animal укажем его тип, а в name — его имя.

Окончательно получаем:

{
  "name": "Ян",
  "age": 27,
  "is_smoking": false,
  "car": {
    "model": "Chevrolet Camaro",
    "color": "красный"
  },
  "pets": [
    {
      "animal": "собака",
      "name": "Чарли"
    },
    {
      "animal": "хомяк",
      "name": "Никсон"
    }
  ]
}

Теперь вы знаете всё, что нужно, чтобы понимать запись JSON-объектов. Однако встаёт вопрос, как извлекать данные из таких объектов?

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

Структура данных в n8n

Итак, мы уже знаем, что для обработки структурированных данных n8n использует формат JSON. Кроме того, мы знаем, что n8n работает сразу с целым набором таких данных. Во вводном курсе это был набор университетов с особыми учебными программами.

n8n представляет набор таких данных как массив объектов, оформленных особым образом. Для простоты мы пока будем считать, что вместе с JSON не передаются бинарные данные (например, изображение).

Допустим, у нас есть два человека, информацию о которых мы видим в окне JSON вот так:

[
  {
    "name": "Ян",
    "age": 27
  },
  {
    "name": "Полина",
    "age": 25
  }
]

На самом деле, для самого n8n всё устроено немного сложнее. Это знание нам понадобится, чтобы использовать значения уже совсем скоро.

У каждого элемента данные лежат в специальном объекте json. За двумя косыми чертами (//) я оставил комментарии — они никак не влияют на корректность записи (за исключением места после закрывающей скобки ].

[ //здесь начинается массив с нашими объектами
  { //здесь начинается первый объект
    "json": {
      "name": "Ян",
      "age": 27
    }
  }, //здесь заканчивается первый объект
  { //здесь начинается второй объект
    "json": {
      "name": "Полина",
      "age": 25
    }
  } //здесь заканчивается второй объект
]

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

[ 
  { 
    "json": {
      "name": "Ян"
    }
  }, 
  { 
    "json": {
      "age": 25
    }
  }
]

В более общем виде, если кроме JSON еще бинарные данные, то первый элемент данных выглядит вот так (остальные указаны как многоточие):

[
  {
    // Каждый элемент содержит свойство "json". Оно может быть и пустым: {}.
    // Любой вид JSON-данных допустим. Так что массивые и вложенные объекты тоже допустимы.
    "json": { // Данные, которыми оперирует n8n (обязательно)
	      // Эти данные — только пример. Могут быть любыми данными формата JSON
      "jsonKeyName": 'keyValue',
      "anotherJsonKey": {
        "lowerLevelJsonKey": 1
      }
    },
    // Бинарные данные элемента. Большинство узлов в n8n их не содержат (опционально)
    "binary": {
      // Название ключа "binaryKeyName" — только для примера. Возможен любой вариант.
      "binaryKeyName": {
        "data": '....', // Двоичные данные в кодировке Base64 (обязательно)
        "mimeType": "image/png", // Необязательно, но по возможности следует установить
        "fileExtension": "png", // Необязательно, но по возможности следует установить
        "fileName": "example.png", // Необязательно, но по возможности следует установить
      }
    }
  },
  ...
]

Упражнения

Давайте потренируемся. У нас есть несколько примеров записи JSON-данных и то, как они могут выглядеть в n8n. Разверните задачу, посмотрите на код и попробуйте ответить — корректный он или нет. Проверьте себя, развернув ответ.

1. Корректна ли запись JSON-данных?

{
 [
	"имя": "Сергей"
 ]
}

2. Корректна ли запись JSON-данных?

[
	{
		"Пирог 234;/": "Ян",
		"age": 27
	},
	{
		"Пирог 234;/": "Полина",
		"age": 25
	}
]

3. Корректна ли запись JSON-данных?

[
	{
		"id": "23423532",
		"name": "Jay Gatsby",
		"email": "gatsby@west-egg.com",
		"notes": "Keeps asking about a green light??",
		"country": "US",
		"created": "1925-04-10"
	},
	{
		"id": "23423533",
		"name": "José Arcadio Buendía",
		"email": "jab@macondo.co",
		"notes": "Lots of people named after him. Very confusing",
		"country": "CO",
		"created": "1967-05-05"
	}
 }
]

4. Корректна ли запись JSON-данных?

[
	{
		"name": "Ян",
		"age": 27,
		"is_smoking": "false",
		"car": {
			"model": Chevrolet Camaro,
			"color": красный
		},
		"pets": [
		]
]

5. Корректна ли запись JSON-данных?

[
  {json: {
     "Полное имя": "Шерлок Холмс",
     "Возраст": 46,
     "Город": "Лондон",
     "Друзья": ["Доктор Ватсон", "Инспектор Лестрейд"],
     "Основные интересы": "Криминальный мир"
     },
   },
   {json: {
     "Полное имя": "Джон Ватсон",
     "Возраст": 44,
     "Город": "Лондон",
     "Друзья": ["Шерлок Холмс", "Инспектор Лестрейд"],
     "Основные интересы": "Медицина"
     },
   },
]

6. Корректна ли запись данных для n8n?

[ //здесь начинается массив с нашими объектами
	{ //здесь начинается первый объект
		{
			json: {"name": "Ян", "age": 27}
		}
	}, //здесь заканчивается первый объект
	{ //здесь начинается второй объект
		{
			json:  {"name": "Полина", "age": 25}
		}
	} //здесь заканчивается второй объект
]

7. Корректна ли запись данных для n8n?

[
	{json: {
			"id": "23423532",
			"name": "Jay Gatsby",
			"email": "gatsby@west-egg.com",
		}
	},
	{json: {
			"country": "CO",
			"created": "1967-05-05"
		}
	}
]

Отметьте все решенные задачи на странице шаблона упражнений Как выглядят данные в n8n

Следующий урок → Самый гибкий узел — Function
К курсу → Автоматизация с n8n: теория и практика
Мои курсы выходят в открытый доступ!