как обработать массив в XDTO

1. umberto_nobile 5 13.02.25 22:17 Сейчас в теме
по интеграции поставщика приходит в JSON одно свойство объекта XDTO в виде массива.

"items": [
{
"type": "CASE",
"isProblem": true,
"reported": true,
"code": "01046004946013301124121217250610214900K00qU",
"isOwner": true,
"gtin": "04600494601330",
"externalItemId": "000000000340030086",
"batch": "SH20212241",
"itemProblemTypes": [ "Not found" ]
}
]
Показать


"itemProblemTypes": [ "Not found" ] выдаёт ошибку преобразования.
как это можно поправить, какой тип установить надо для свойства XDTO?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. umberto_nobile 5 03.03.25 09:38 Сейчас в теме
(1) я пока нашёл временный выход
itemProblemTypes сделал типом строка и вставляю туда константу "здесь будет массив" к примеру.
при сериализации получаю json-строку: "itemProblemTypes" : "здесь будет массив"
а потом подменяю её на нужную с помощью функции стрЗаменить().

в качестве костыля работает. но это не спортивно.
прошу откликнуться тех, кто подружил XDTO с объектом типа Массив-json
3. user-z99999 78 03.03.25 09:44 Сейчас в теме
(1) https://infostart.ru/1c/articles/1924346/

Ну вроде все, мы разобрались с примитивными типами. Но! В JSON есть еще такое понятие как массив. Обработать мы его можем, но с кучей ограничений. Мы не можем просто взять и передать поле в XDTO-пакет
4. umberto_nobile 5 03.03.25 10:31 Сейчас в теме
(3) спасибо, что откликнулись, но у поставщика требование по API именно должен быть массив-json, а не массив объектов.
5. user1936660 03.03.25 10:48 Сейчас в теме
(4)
у поставщика требование по API именно должен быть массив-json
А зачем тебе XDTO тогда вообще?
6. fixin 4280 03.03.25 16:52 Сейчас в теме
(5) присоединяюсь к оратору. Нужно показать весь объект XDTO, как именно там это свойство в JSON приходит, видимо оно должно храниться строкой. Что-то я не понял о чем задача.
9. umberto_nobile 5 04.03.25 08:21 Сейчас в теме
(6) задача состоит в том, что при десериализации свойства:
"itemProblemTypes": [ "Not found","Found but not" ] с помощью механизмов XDTO происходит ошибка из-за того, что я никак не могу подобрать тип этого свойства в описании объекта XDTO.
и именно это свойство является json-массивом.
8. umberto_nobile 5 04.03.25 08:16 Сейчас в теме
(5) этот механизм я использую для десериализации
11. user1936660 04.03.25 16:54 Сейчас в теме
(8)
этот механизм я использую для десериализации
А как ты десериализуешь элемент "items", который тоже является массивом?
10. spacecraft 04.03.25 12:55 Сейчас в теме
(4)
но у поставщика требование по API именно должен быть массив-json, а не массив объектов.

а у постовщика есть требование использовать xdto?
xtdo - XML Data Transfer Objects
То что можно использовать json, еще не означает, что можно нарушать структуру xdto.
ПрочитатьJSON должен отрабатывать нормально. Полученные данные уже используйте для заполнения необходимых сущностей.
starik-2005; +1 Ответить
13. starik-2005 3166 04.03.25 18:42 Сейчас в теме
(10)
а у постовщика есть требование использовать xdto?
Прям не удивлюсь)))
7. user-z99999 78 03.03.25 17:33 Сейчас в теме
(1) Можно так получить массив:
	Джисон =  "[
			|{
			|""type"": ""CASE"",
			|""isProblem"": true,
			|""reported"": true,
			|""code2"": ""01046004946013301124121217250610214900K00qU"",
			|""isOwner"": true,
			|""gtin"": ""04600494601330"",
			|""externalItemId"": ""000000000340030086"",
			|""batch"": ""SH20212241"",
			|""itemProblemTypes"": [ ""Not found"" ]
			|}
			|]";


    ЧтениеДЖ = Новый ЧтениеJSON;
    ЧтениеДЖ.УстановитьСтроку(Джисон);
    МассивДжи = ПрочитатьJSON(ЧтениеДЖ, Истина);

Показать
starik-2005; +1 Ответить
12. starik-2005 3166 04.03.25 18:38 Сейчас в теме
(1)
акой тип установить надо для свойства XDTO
String, unbounded - как-то так...
14. exitone 1 05.03.25 20:26 Сейчас в теме
(1)

https://github.com/vbondarevsky/Connector

используйте это и будет вам счастье

Чтение ответа XML как XDTO
Метод КакXDTO преобразует ответ XML в ОбъектXDTO.

Результат = КоннекторHTTP.КакXDTO(Ответ);
15. Tommy82 65 06.03.25 11:12 Сейчас в теме
(1)
(14)
Типовая из ЕРП

Функция ОбъектXDTOВСтруктуру(ОбъектXDTO, ПараметрыПреобразования = Неопределено) Экспорт
    
    Структура      = Новый Структура;
    ТипОбъектаXDTO = ОбъектXDTO.Тип();
    
    Для Каждого Свойство Из ОбъектXDTO.Свойства() Цикл
        
        ИмяСвойства      = Свойство.Имя;
        ЗначениеСвойства = ОбъектXDTO[ИмяСвойства];
        
        Если ТипЗнч(ЗначениеСвойства) = Тип("ОбъектXDTO") Тогда
            
            Структура.Вставить(ИмяСвойства, ОбъектXDTOВСтруктуру(ЗначениеСвойства, ПараметрыПреобразования));
            
        ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("СписокXDTO") Тогда
            
            Структура.Вставить(ИмяСвойства, Новый Массив);
            Для Индекс = 0 По ЗначениеСвойства.Количество() - 1 Цикл
                
                ЭлементСписка = ЗначениеСвойства.Получить(Индекс);
                Если ТипЗнч(ЭлементСписка) = Тип("ОбъектXDTO") Тогда
                    Структура[ИмяСвойства].Добавить(ОбъектXDTOВСтруктуру(ЭлементСписка, ПараметрыПреобразования));
                Иначе
                    Структура[ИмяСвойства].Добавить(ЭлементСписка);
                КонецЕсли;
                
            КонецЦикла;
            
        Иначе
            
            Структура.Вставить(ИмяСвойства, ЗначениеСвойства);
            
            Если ПараметрыПреобразования <> Неопределено
                И ПараметрыПреобразования.НайтиИдентификаторы
                И Свойство.Тип = ПараметрыПреобразования.ТипUUID Тогда
                
                РезультатПоиска = ПараметрыПреобразования.ТипыИдентификаторов[ТипОбъектаXDTO];
                Если РезультатПоиска <> Неопределено
                    И РезультатПоиска.ИмяПоля = ИмяСвойства Тогда
                    ПараметрыПреобразования.Идентификаторы[РезультатПоиска.ИмяТаблицы].Вставить(ЗначениеСвойства, РезультатПоиска.ПустоеЗначение);
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Структура;
    
КонецФункции
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот