Преобразование данных из JSON в YML-файл для Яндекс Бизнес

Задача. Есть полученные через API данные, которые хранятся на сервере в JSON-формате. Нужно составить из них YML файл для передачи в Яндекс Бизнес

Преобразование данных из JSON в YML-файл для Яндекс Бизнес

Введение

Для передачи данных в Яндекс Бизнес необходимо преобразовать их из JSON-формата в YML-файл. В данной статье описывается процесс преобразования данных, включая загрузку, обработку и сохранение в нужном формате.

Исходные данные

Исходные данные хранятся в JSON-формате и содержат информацию о ценах. Пример JSON-данных:

{
  "prices": [
    {
      "filialId": 1,
      "receptionId": 7,
      "nomenclatureId": 208,
      "name1C": "Название 1",
      "nameA3": "",
      "code1C": "246befa2-b0b9-11ec-bec8-0050569e8d43",
      "businessId": 2,
      "cost": 160
    },
    {
      "filialId": 1,
      "receptionId": 7,
      "nomenclatureId": 212,
      "name1C": "Название 2",
      "nameA3": "",
      "code1C": "246befa3-b0b9-11ec-bec8-0050569e8d43",
      "businessId": 1,
      "cost": 150
    }
  ]
}

Перечень категорий

Категории, соответствующие параметру businessId, хранятся в отдельном массиве:

$cat = [
    '1' => 'Категория 1',
    '2' => 'Категория 2',
    '3' => 'Категория 3',
    '4' => 'Категория 4',
];

Требования к YML-файлу

Требования к YML-файлу можно найти на странице поддержки Яндекс Бизнес. Примерный формат YML-файла:

<yml_catalog>
  <shop>
    <categories>
      <category id="1">Категория 1</category>
      <category id="2">Категория 2</category>
      <category id="3">Категория 3</category>
    </categories>
    <offers>
      <offer id="1">
        <name>Название 1</name>
        <vendor>Название_компании</vendor>
        <price>13</price>
        <currencyId>RUR</currencyId>
        <categoryId>1</categoryId>
      </offer>
      <offer id="208">
        <name>Название 2</name>
        <vendor>Название_компании</vendor>
        <price>160</price>
        <currencyId>RUR</currencyId>
        <categoryId>2</categoryId>
      </offer>
    </offers>
  </shop>
</yml_catalog>

Решение

Ниже приведен PHP-код, который выполняет преобразование данных из JSON в YML-файл:

<?php

$filePath = $_SERVER["DOCUMENT_ROOT"] . "/parse_data/all_prices/1_10.json";

// Извлечение данных из JSON-файла и преобразование в массив PHP
$jsonDataFromFile = file_get_contents($filePath);
$requestPrices = json_decode($jsonDataFromFile, true);

foreach ($requestPrices['prices'] as $price) {
    $arPrice[$price['nomenclatureId']]['offer'] = $price['nomenclatureId'];
    $arPrice[$price['nomenclatureId']]['businessId'] = $price['businessId'];
    $arPrice[$price['nomenclatureId']]['vendor'] = 'Название_компании';
    $arPrice[$price['nomenclatureId']]['name'] = $price['name1C'];
    $arPrice[$price['nomenclatureId']]['code1C'] = $price['code1C'];
    $arPrice[$price['nomenclatureId']]['cost'] = $price['cost'];
    $arPrice[$price['nomenclatureId']]['currencyId'] = 'RUR';
}

$xml = new SimpleXMLElement('<yml_catalog/>');
$shop = $xml->addChild('shop');
$categories = $shop->addChild('categories');

$cat = [
    '1' => 'Категория 1',
    '2' => 'Категория 2',
    '3' => 'Категория 3',
    '4' => 'Категория 4',
];

// Добавляем категории
$businessIds = [];
foreach ($arPrice as $item) {
    $businessId = $item['businessId'];
    if (!in_array($businessId, $businessIds) && isset($cat[$businessId])) {
        $category = $categories->addChild('category', $cat[$businessId]);
        $category->addAttribute('id', $businessId);
        $businessIds[] = $businessId;
    }
}

$offers = $shop->addChild('offers');

// Добавляем предложения
foreach ($arPrice as $item) {
    $offer = $offers->addChild('offer');
    $offer->addAttribute('id', $item['offer']);
    $offer->addChild('name', $item['name']);
    $offer->addChild('vendor', $item['vendor']);
    $offer->addChild('price', $item['cost']);
    $offer->addChild('currencyId', $item['currencyId']);
    $offer->addChild('categoryId', $item['businessId']);
}

// Сохраняем XML в файл
$xmlFilePath = $_SERVER["DOCUMENT_ROOT"] . "/xml_data/feed-1_10.xml";
$xml->asXML($xmlFilePath);

?>

Описание шагов

  1. Загрузка данных из JSON-файла: Указывается путь к JSON-файлу, содержащему данные о ценах. Данные из JSON-файла извлекаются и преобразуются в массив PHP с помощью функции json_decode.
  2. Преобразование данных: Создается ассоциативный массив $arPrice, где ключами являются nomenclatureId, а значениями — данные о предложениях (offer), включая businessId, vendor, name, code1C, cost и currencyId.
  3. Создание XML-структуры: Инициализируется объект SimpleXMLElement для создания XML-документа. Добавляется корневой элемент <shop> и его дочерние элементы <categories> и <offers>.
  4. Добавление категорий: Создается массив $cat, содержащий соответствие между businessId и названиями категорий. Проходится по массиву $arPrice, и для каждого уникального businessId добавляется элемент <category> в XML, если он существует в массиве $cat.
  5. Добавление предложений: Проходится по массиву $arPrice, и для каждого элемента добавляется элемент <offer> в XML. Каждому элементу <offer> добавляются дочерние элементы <name>, <vendor>, <price>, <currencyId> и <categoryId>, заполняемые данными из массива $arPrice.
  6. Сохранение XML-файла: Сформированный XML-документ сохраняется в файл по указанному пути.

Этот процесс позволяет преобразовать данные из JSON в структурированный YML-файл, соответствующий требованиям Яндекс Бизнес.

Теги:  JSON, YML, Яндекс Бизнес, PHP, XML, преобразование данных, категории, предложения

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.