JSON от поставщика: загрузка, снапшот и преобразования

Как Eofferix принимает JSON-файлы и JSON-ответы, строит снапшот уникальных узлов и преобразует данные в XML, таблицы, другой JSON или импорт.

Eofferix принимает JSON-файлы и JSON-ответы. Данные можно загрузить как разовый файл, получать автоматически из вложения к email, забирать по прямой ссылке, по ссылке с авторизацией, через FTP/FTPS/SFTP или из API поставщика.

После получения JSON можно преобразовать в XML, в таблицы CSV/XLSX, в другой JSON с измененными параметрами и значениями или импортировать в приложения, которые поддерживает сервис.

JSON-снапшот поставщика в Eofferix
После загрузки сервис показывает короткий снапшот с уникальными узлами и примерами значений.

Как работает снапшот

Файл анализируется сервисом и превращается в короткий снапшот с уникальными узлами. Если в массиве тысяча товаров, в снапшоте будет показана структура одного типового элемента и набор встречающихся полей, а не тысяча повторов.

В снапшоте можно задать новые названия узлам, изменить структуру, убрать лишние поля, создать новые узлы и настроить правила преобразования. На следующем запуске эти правила применяются ко всему JSON, который пришел из источника.

Что можно преобразовать

  • Переименование полей. Например, id превратить в external_id, name в title, prices.base в price.
  • Фильтрация записей. Оставить только товары, где flags.active = true, или выгружать только товары с остатком больше нуля.
  • Изменение вложенности. Развернуть вложенный stock[] в список складов, собрать attributes[] в характеристики, а изображения перенести в отдельный узел media.
  • Расчет значений. Сложить строку категории, посчитать цену со скидкой, привести валюту, заполнить дату импорта.
  • Преобразовать изображения. Конвертировать в формат jpg/png/webp, изменить размер изображений, наложить водяной знак.
  • Импорт в приложение. Привязать узлы JSON к полям каталога, CRM, CMS или другого поддерживаемого направления.
Настройки значения Цена с правилами преобразования JSON
Пример последовательных преобразований для поля Цена. Преобразования могут учитывать не только текущее значение, но и использовать для расчетов иные узлы документа.

Примеры преобразований

Инструмент преобразований позволяет сильно изменить итоговую выгрузку: отфильтровать лишние элементы, переименовать узлы, собрать новую структуру, посчитать значения по правилам, заполнить новые поля данными из других мест документа и подготовить результат под требования маркетплейса, сайта, PIM или внутренней системы.

Что сделано в примере с ценой

Ниже те же правила разложены по шагам. Каждый скриншот показывает только строку правила, которая отвечает за текущий шаг.

1. Сначала удаляем пробелы из значения цены. Это полезно, когда поставщик присылает цену как строку вроде 12 990.

Удалить пробелы

2. Если цена не пустая, сервис увеличивает ее на 15%. Так можно добавить наценку, не меняя исходный JSON.

Шаг 2: расчет наценки

3. Дальше правило смотрит на другой узел документа: /catalog/items/stock/qty. Если остаток меньше 5, цена заменяется на 0.

Шаг 3: остаток меньше 5 - заменить на 0

4. Еще одно правило использует узел /catalog/items/brand: для бренда TestBrand цена дополнительно умножается на 1,5.

Шаг 4: бренд TestBrand - умножить на 1,5

5. В конце результат округляется до одного знака по стандартным правилам.

Шаг 5: округление результата

Простой пример: переименовать поля и оставить активные товары

В этом примере берем элементы из catalog.items[], оставляем только активные товары и приводим названия полей к формату целевой выгрузки.

Было
исходные данные
{
  "id": "A-100",
  "sku": "ITEM-100",
  "name": "Кресло Nordic",
  "prices": {
    "base": 129.90,
    "discount": 119.90
  },
  "flags": {
    "active": true
  }
}
Стало
после настройки
{
  "external_id": "A-100",
  "sku": "ITEM-100",
  "title": "Кресло Nordic",
  "price": 119.90,
  "old_price": 129.90
}

Правила:

  1. В исходном JSON есть товар с id = A-100. Остальные товары идут по такой же структуре, но снапшот показывает один представитель повторяющегося массива catalog.items[]. Кликните значение true внутри объекта flags, в поле active, и в блоке Условия выгрузки выберите Условие для элемента целиком. Так можно выгружать только элементы со значением true или, наоборот, не выгружать элементы со значением false.
    Условия выгрузки для активного товара
    Условие применено к элементу целиком: товар попадает в выгрузку, если flags.active равно true; второе правило можно использовать как обратную проверку для false.
  2. Переименуйте узел id в external_id: кликните по названию узла и введите новое название.
    Переименование узла id в external_id
    Настройки узла: новое имя external_id вводится в поле Название узла.
  3. По тому же принципу переименуйте name в title. Отдельный скриншот здесь не нужен: действие такое же, как для id.
  4. С ценами есть два рабочих сценария. Если структура prices подходит, достаточно переименовать prices.discount в price, а prices.base в old_price. Если price и old_price должны лежать на уровне товара, создайте новые узлы рядом с id и name, заполните их значениями из /catalog/items/prices/discount и /catalog/items/prices/base, затем не выгружайте старый контейнер prices.
    Заполнение нового узла price значением из prices.discount
    Для нового поля price используется действие заменить: значение берется из другого узла документа.

Новые узлы

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

Добавление нового узла final_price в JSON-снапшоте

Узел можно заполнить:

  1. значением из другого места исходного файла, например записать в него название, артикул, бренд или соединить несколько значений и получить, к примеру, единое поле Название артикул бренд;
  2. системным значением, например датой запуска или именем источника;
  3. выражением, например склеить путь категории или посчитать процент скидки;
  4. можно сделать его переменной.

Переменные: зачем они нужны

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

Важно: переменные не попадают в итоговую выгрузку. Они служат только для помощи остальным преобразованиям: можно сохранить промежуточный результат и использовать его дальше в правилах, условиях или расчетах.

Настройка узла final_price как переменной
Узел можно сделать переменной: она вычисляется раньше остальных полей и затем используется в правилах и условиях.

Например, переменная final_price рассчитывается один раз:

final_price = prices.discount если prices.discount заполнен, иначе prices.base

После этого ее можно использовать сразу в нескольких правилах:

  • product.prices.price = final_price;
  • product.prices.old_price = prices.base, если final_price меньше базовой цены;
  • product.prices.discount_percent рассчитывается от prices.base и final_price;
  • условие выгрузки проверяет, что final_price больше нуля.

Так правила остаются короче, а цена в разных частях результата не расходится из-за повторного ручного расчета.