Версия для печати темы (https://pro1c.org.ua/index.php?s=b4373ac7e9fcaa2be66c0e98ab3ba423&showtopic=62822)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Как прочитать и перебрать JSON

Автор: burza 11.11.20, 10:42

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

{"error":"","errorMessage":"","result":[{"userType":1,"managerID":"1","managerExternalID":null,"managerLogin":
"Evgeniy","officeID":"1","officeExternalID":null,"officeName":"Дана-
Автогруп","officeMode":0,"customerID":"32565","customerExternalID":null,"categoryID":"2","categoryExternalID":null,"categoryName":
"ОПТ","name":"Олег","secondName":"Иванович ","surname":"Коломиец ","fullName":"Коломиец  
Олег Иванович ","login":"Olepka","phone":"+380(97)906-19-44","mobilePhone":null,"email":"Olepka@ukr.net","icq":null,"skype":null,"country":
"Украина","region":"Николаевская область","city":"Николаев","organizationName":null,"businessID":null,"businessExternalID":null,"businessName":
null,"balance":"99.96","creditLimit":null,"managerComment":null,"contragentType":"1","organizationFormID":null,"
organizationFormExternalID":null,"organizationFormName":null,"groupID":null,"groupExternalID":null,"groupName":null,"preferredCurrencyID":null,"
preferredCurrencyExternalID":null,"preferredCurrencyISO":null,"aiBalanceOrdered":"0.00","
aiBalanceActiveOrdered":"0.00","aiBalanceTotal":"0.00","aiBalanceByReturn":"0.00","aiBalanceDelayed":"0.00","dateRegistered":"2020-10-19 19:50:24"}]}


burza @ Сегодня, 10:03 * ,
ну кто поможет незнающему)

Автор: sava1 11.11.20, 11:12

в Гугле забанили ?
куча статей и примеров.
Кто хочет разбираться в куче текста Вашего файла ?

Автор: Vofka 11.11.20, 11:36

Обычно мне не очень импонируют ответы в стиле

Цитата(sava1 @ 11.11.20, 11:12) *
в Гугле забанили ?

Но тут как бы да... Первая ссылка в гугле: https://pro1c.org.ua/redirect.php?https://wonderland.v8.1c.ru/blog/sredstva-raboty-s-json/

Автор: burza 11.11.20, 11:45

В принципе ожидаемо!

Автор: Vofka 11.11.20, 11:50

Цитата(burza @ 11.11.20, 11:45) *
В принципе ожидаемо!

А на что вы рассчитывали? Тривиальная задача с кучей информации вокруг как это делается. bn.gif
Готовый код могут написать, например, https://pro1c.org.ua/index.php?act=work. Но за деньги.

Автор: sava1 11.11.20, 12:23

burza @ Сегодня, 11:45 * ,
Если бы это была стандартная сериализация - тогда можно было бы получить ответ.
У Вас чем-то сформирован файл - читайте, разбирайте, вписывайте в Контрагенты

Автор: burza 11.11.20, 13:09



fullName в JSON один , а на выходе двоит файлы, сначала пишет Коломиец и второй строкой уже полное Коломиец Олег Иванович

как исправить? где втыкаю

FileName = "c:\1CData\test.json";

     //   Сообщить(FileName);                                                                                          
          
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку("");    
        ЧтениеJSON.ОткрытьФайл(FileName);
        
        
        
        Пока ЧтениеJSON.Прочитать() Цикл
            
            //НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();            
            TипJSON = ЧтениеJSON.ТипТекущегоЗначения;
        
              Если TипJSON = ТипЗначенияJSON.Число ИЛИ TипJSON = ТипЗначенияJSON.Строка ИЛИ TипJSON = ТипЗначенияJSON.Булево ИЛИ TипJSON = ТипЗначенияJSON.Null Тогда
                     Значение = ЧтениеJSON.ТекущееЗначение;                
              ИначеЕсли TипJSON = ТипЗначенияJSON.Комментарий Тогда
                      Комментарий = ЧтениеJSON.ТекущееЗначение;
              ИначеЕсли TипJSON = ТипЗначенияJSON.ИмяСвойства Тогда        
                      ИмяСвойства = ЧтениеJSON.ТекущееЗначение;                    
              КонецЕсли;
              
            //НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();  

            Если      ИмяСвойства ="fullName" Тогда
                Сообщить(Значение);
                //НовыйЭлемент.Наименование = Значение;
                //НовыйЭлемент.НаименованиеПолное = Значение;
                // ИмяСотрудника=Значение;
            // ИначеЕсли ИмяСвойства ="customerID" Тогда
              //   НовыйЭлемент.Код= Значение;
              //    ФамилияСотрудника=Значение;
              //ИначеЕсли ИмяСвойства ="packaging" Тогда        
              //    packaging=Значение;
              //ИначеЕсли ИмяСвойства ="series" Тогда    
              //    series=Значение;
              //ИначеЕсли ИмяСвойства ="manufacturer_name" Тогда    
              //    manufacturer_name=Значение;
              //ИначеЕсли ИмяСвойства ="info_letter_fullname" Тогда    
              //        info_letter_fullname=Значение;
              //ИначеЕсли ИмяСвойства ="cert_num" Тогда        
              //        cert_num=Значение;
              //  ИначеЕсли ИмяСвойства ="info_letter_url" Тогда        
              //        info_letter_url=Значение;
               //НовыйЭлемент.Наименование = "123";
               //НовыйЭлемент.НаименованиеПолное ="123";
              //НовыйЭлемент.ФормаСобственности= Перечисления.ФормыСобственности.ЧастноеЛицо;
              //НовыйЭлемент.СогласиеНаОбработкуПерсональныхДанных = Перечисления.ВариантыОтветов.Да;
              //НовыйЭлемент.ВидКонтрагента = Перечисления.ВидыКонтрагентов.Покупатель;
              //
                //НовыйЭлемент.Записать();
                  КонецЕсли;
            //НовыйЭлемент.Записать();       
                  

         КонецЦикла;
//ЧтениеJSON.Закрыть();

Автор: sava1 11.11.20, 13:27

Цитата(burza @ 11.11.20, 10:42) *
,"surname":"Коломиец ","fullName":"Коломиец


Вы получаете ИмяСвойста ФуллНейм , при этом Значение - Коломиец, следующее - Имя свойства - ФуллНейм, а Значение - Полное наименование

Автор: burza 11.11.20, 13:30

sava1 @ Сегодня, 13:27 * ,
как оставить только фулнейм? мне нужно что в фулнейме вписать в справочник. то есть мне нужно только одно значения.

Автор: sava1 11.11.20, 13:39

тогда наверно Значение и ИмяСвойства надо заполнять в одном разделе Если

типо так

Если TипJSON = ТипЗначенияJSON.Число ИЛИ TипJSON = ТипЗначенияJSON.Строка ИЛИ TипJSON = ТипЗначенияJSON.Булево ИЛИ TипJSON = ТипЗначенияJSON.Null Тогда
                     ИмяСвойства = ЧтениеJSON.ТекущееЗначение;                    
                     Значение = ЧтениеJSON.ТекущееЗначение;                
,,,                
              КонецЕсли;


вооще-то проще заполнить Соответствие - Ключ_Значение, а потом обрабатывать

Автор: burza 11.11.20, 14:03

sava1 @ Сегодня, 13:38 * ,
спс

Сообщить выводит все правильно а вот когда пытаюсь записать с справочник говорит что там пусто реквезит не заполнен?

        
            НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();            
            TипJSON = ЧтениеJSON.ТипТекущегоЗначения;
        
              Если TипJSON = ТипЗначенияJSON.Число ИЛИ TипJSON = ТипЗначенияJSON.Строка ИЛИ TипJSON = ТипЗначенияJSON.Булево ИЛИ TипJSON = ТипЗначенияJSON.Null Тогда
                     Значение = ЧтениеJSON.ТекущееЗначение;                
              ИначеЕсли TипJSON = ТипЗначенияJSON.Комментарий Тогда
                      Комментарий = ЧтениеJSON.ТекущееЗначение;
                  ИначеЕсли TипJSON = ТипЗначенияJSON.ИмяСвойства Тогда
                      
                      ИмяСвойства = ЧтениеJSON.ТекущееЗначение;
                      
                /////////////////////////////////////////////////////////////      
                Если   ИмяСвойства ="login" Тогда
                // Сообщить(Значение);
                //НовыйЭлемент.Наименование = Значение;
                //НовыйЭлемент.НаименованиеПолное = Значение;
                
                ИначеЕсли ИмяСвойства ="customerExternalID" тогда
                
                НовыйЭлемент.Код= Значение;                
                    //Сообщить(Значение);
              
                КонецЕсли;
                            
            //НовыйЭлемент.Записать();
        КонецЕсли;

Автор: Alegzander 11.11.20, 14:11

burza @ Сегодня, 15:03 * ,
Какой реквизит? "Наименование"? Установка "Наименование" закоментирована: //НовыйЭлемент.Наименование = Значение;

Автор: burza 11.11.20, 14:22

Alegzander @ Сегодня, 14:11 * ,
код

Автор: sava1 11.11.20, 14:32

Те-же грабли - в Если ... КонецЕсли // Значение и ИмяСвойства заполняем попарно

Автор: burza 11.11.20, 14:41

1

burza @ Сегодня, 14:33 * ,
запутался уже)

Автор: daveal 11.11.20, 15:38

А зачем в ручную свойства обходить? Есть же метод ПрочитатьJSON - на выходе будет структура. В ней массив структур results судя по входящим данным

Автор: burza 11.11.20, 15:45

daveal @ Сегодня, 15:38 * ,
ну вот дайте пример как это все обойти и в клиентов записать)

Автор: daveal 11.11.20, 15:53

burza @ Сегодня, 16:45 * ,

Сделайте через прочитатьJson в отладчике и там все будет понятно

Автор: Petre 11.11.20, 16:06

burza @ Today, 15:45 * ,

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(МойТекстJSON);
ПрочитанноеЗначениеКотороеНеобходимоПосмотретьВОтладчике = ПрочитатьJSON(ЧтениеJSON);

Автор: Alegzander 12.11.20, 7:47

burza @ Вчера, 16:45 * ,

    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.ОткрытьФайл("c:/test.json");
    ПрочитанноеЗначениеКотороеНеобходимоПосмотретьВОтладчике = ПрочитатьJSON(ЧтениеJSON,Истина);
    Для Каждого стр Из ПрочитанноеЗначениеКотороеНеобходимоПосмотретьВОтладчике["result"] Цикл
        НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();  
        НовыйЭлемент.Код=стр["customerID"];
        НовыйЭлемент.Наименование=стр["login"];
        НовыйЭлемент.Записать();
    КонецЦикла;

Автор: mut 12.11.20, 18:01

Если из приведенного в начале примера JSON-а убрать символы перевода строк, он становится нормальным валидным джисоном, 1с его читает стандартными методами. В соответствие или структуру, как вам удобнее.

Текст после очистки:

{
    "error": "",
    "errorMessage": "",
    "result": [{
        "userType": 1,
        "managerID": "1",
        "managerExternalID": null,
        "managerLogin": "Evgeniy",
        "officeID": "1",
        "officeExternalID": null,
        "officeName": "Дана-Автогруп",
        "officeMode": 0,
        "customerID": "32565",
        "customerExternalID": null,
        "categoryID": "2",
        "categoryExternalID": null,
        "categoryName": "ОПТ",
        "name": "Олег",
        "secondName": "Иванович ",
        "surname": "Коломиец ",
        "fullName": "Коломиец Олег Иванович ",
        "login": "Olepka",
        "phone": "+380(97)906-19-44",
        "mobilePhone": null,
        "email": "Olepka@ukr.net",
        "icq": null,
        "skype": null,
        "country": "Украина",
        "region": "Николаевская область",
        "city": "Николаев",
        "organizationName": null,
        "businessID": null,
        "businessExternalID": null,
        "businessName": null,
        "balance": "99.96",
        "creditLimit": null,
        "managerComment": null,
        "contragentType": "1",
        "organizationFormID": null,
        "organizationFormExternalID": null,
        "organizationFormName": null,
        "groupID": null,
        "groupExternalID": null,
        "groupName": null,
        "preferredCurrencyID": null,
        "preferredCurrencyExternalID": null,
        "preferredCurrencyISO": null,
        "aiBalanceOrdered": "0.00",
        "aiBalanceActiveOrdered": "0.00",
        "aiBalanceTotal": "0.00",
        "aiBalanceByReturn": "0.00",
        "aiBalanceDelayed": "0.00",
        "dateRegistered": "2020-10-19 19:50:24"
    }]
}

Автор: Anderson 19.11.20, 14:29

А зачем изобретать велосипед. Спасибо человеку, все делается в одну строку. https://pro1c.org.ua/redirect.php?https://github.com/vbondarevsky/Connector
Результат = КоннекторHTTP.GetJson("http://httpbin.org/get");

Автор: Petre 19.11.20, 14:42

Anderson @ Today, 14:29 * ,
Вы вообще о чем?

Автор: Anderson 20.11.20, 9:34

Petre, Судя по всему у автора проблемы с пониманием принципа работы с данными такого типа. Предоставил готовый вариант, который в одну строку распарсит его данные в удобный формат.

Автор: Vofka 20.11.20, 10:19

Anderson @ Сегодня, 9:34 * ,
Работа с json это не всегда http запрос куда-то.

Автор: Anderson 20.11.20, 23:31

Vofka, Да и такое встречается.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua