helpf.pro
Регистрация
 +3 
Распечатать

Работа с форматом JSON в 1С

При обмене данными с веб-сайтами зачастую используется формат JSON. К сожалению, в 1С нет стандартных процедур для работы с данным форматом. В процессе реализации одного из проектов мной был разработан ряд процедур и функций облегчающих жизнь программисту 1С при работе с данными в формате JSON.

По сути, при работе с JSON требуется две операции: сформировать строку JSON (например, для передачи параметров на веб-сервер в формате JSON из 1С) и прочитать данные из строки JSON (например, когда мы получаем ответ от веб-сервера в формат JSON). Так как формат JSON в упрощенном виде представляет собой набор параметров в виде <ИмяПараметра>:<ЗначениеПараметра> то для работы с JSON в 1С мной был использован тип "Структура". Т.е. процедура чтения данных из формата JSON преобразует строку JSON в тип 1С "Структура". Так же и строка JSON в 1С формируется из структуры. Т.о. чтобы сформировать строку JSON сначала необходимо заполнить структуру необходимыми значениями, а потом вызвать функцию, преобразующую структуру в JSON. Позднее функционал функции формирования строки JSON был расширен - теперь в JSON может быть преобразован массив и таблица значений. При желании можно доработать функцию так, чтобы она "понимала" и другие типы. Такие как "Cоответствие", "ДеревоЗначений" и др. На практике это редко может пригодиться, поэтому сам я этого делать не стал.

А теперь подробней о том, как работать с функциями преобразования JSON.


Преобразование строки JSON в структуру 1С.
Для преобразования строки JSON в структуру 1С служит функция ЗаполнитьСтруктуруИзJSON().
Код 1C v 8.х
 Функция ЗаполнитьСтруктуруИзJSON(<ТекстJON>)   

<ТекстJSON> (обязательный) - строка в формате JSON,
которую необходимо преобразовать в структуру.

Возвращаемое значение.
Тип Структура.
Имя значения задается в структуре как Ключ, а само значение, соответственно, как значение. Поддерживаются также вложенные значение ("{}" в "{}") и массивы. В таких случаях тип значения будет Структура и Массив соответственно. Если у в JSON задан только массив, то сформируется структура с одним элементом с ключом "Значение" и типом "Массив". Ниже приведены поясняющие примеры:
Код 1C v 8.х
 СтрокаJSON = "{""server"":""10234"",""user"":""3745"",""hash"":""8263ad83ce""}";
Результат = ЗаполнитьСтруктуруИзJSON(СтрокаJSON);

Сообщить("server:" + Результат.server + "
|user:" + Результат.user + "
|hash:" + Результат.hash);


// пример значений с массивом
СтрокаJSON = "{""server"":""10234"",""users"":[""3745"",""7462"",""2374""],""hash"":""8263ad83ce""}";
Результат = ЗаполнитьСтруктуруИзJSON(СтрокаJSON);

Сообщить("server:" + Результат.server + "
|hash:" + Результат.hash);

для каждого user ИЗ Результат.users Цикл
Сообщить("user: " + user);
КонецЦикла;

// еще один пример значений с массивом
СтрокаJSON = "{""server"":""10234"",""users"":[{""id"":""3745"",""name"":""Jack""},{""id"":""7462"",""name"":""Nick""}>";
Результат = ЗаполнитьСтруктуруИзJSON(СтрокаJSON);

Сообщить("server:" + Результат.server);

для каждого user Из Результат.users Цикл
Сообщить("user id: " + user.id +
", user name: " + user.name);
КонецЦикла;

// только массив
СтрокаJSON = "[""Nissan"",""Ford"",""Audi""]";
Результат = ЗаполнитьСтруктуруИзJSON(СтрокаJSON);

для каждого Авто Из Результат.Значение Цикл
Сообщить(Авто);
КонецЦикла;


Следует заметить, что все значения заполняются как строковые (тип "Строка"). Последующее преобразование (например, к числу) лежит на самом разработчике.

Формирование строки JSON в 1С.
Для формирования строки в формате JSON в 1С предназначена функция СформироватьСтрокуJSON().
Код 1C v 8.х
 Функция СформироватьСтрокуJSON(<Объект>)    

<Объект> (обязательный) - объект, который необходимо
преобразовать в формат JSON. Может иметь тип "Структура",
"Массив" или "ТаблицаЗначений".
Если Объект имеет тип "ТаблицаЗначений", то она рассматривается как массив из структур, соответствующих колонкам ТЗ. Все значения приводятся к строковому типу, дата приводится в формат unixtime, значение типа булево "Истина" преобразуется в строку "true", а "Ложь" - в "false, прочие объекты просто преобразуются как "Строка(Объект)".

Ниже приведены поясняющие примеры.
Код 1C v 8.х
 ////////////////////////////////////////////////////////
// преобразование простой структуры
Данные = Новый Структура("server,user,hash",
10234, 3745, "8263ad83ce");
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// {"server":"10234","user":"3745","hash":"8263ad83ce"}

////////////////////////////////////////////////////////
// преобразования массива
Данные = Новый Массив;
Данные.Добавить("Nissan");
Данные.Добавить("Ford");
Данные.Добавить("Audi");

СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// ["Nissan","Ford","Audi"]

////////////////////////////////////////////////////////
// преобразование сложной структуры
Данные = Новый Структура;
Данные.Добавить("server", 10234);
Данные.Добавить("users", Новый Массив);
Данные.Добавить("hash", "8263ad83ce");

Данные.users.Добавить(3745);
Данные.users.Добавить(7462);
Данные.users.Добавить(2374);

СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// {"server":"10234","users":["3745","7462","2374"],"hash":"8263ad83ce"}

////////////////////////////////////////////////////////
// еще один пример массива
Данные = Новый Структура;
Данные.Вставить("server", 10234);
Данные.Вставить("users", Новый Массив);

Данные.users.Добавить(Новый Структура("id,name", 3745, "Jack"));
Данные.users.Добавить(Новый Структура("id,name", 7246, "Nick"));

СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// {"server":"10234","users":[{"id":"3745","name":"Jack"},{"id":"7462","name":"Nick"}>

////////////////////////////////////////////////////////
// преобразование таблицы значений
ТаблПользователей = Новый ТаблицаЗначений;
ТаблПользователей.Колонки.Добавить("id");
ТаблПользователей.Колонки.Добавить("name");

НоваяСтрока = ТаблПользователей.Добавить();
НоваяСтрока.id = 3276;
НоваяСтрока.name = "Jack";

НоваяСтрока = ТаблПользователей.Добавить();
НоваяСтрока.id = 3276;
НоваяСтрока.name = "Nick";

СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// [{"id":"3745","name":"Jack"},{"id":"7462","name":"Nick"}]

Автор: Павел Толкачев
Разместил:   Версии: | 8.x |  Дата:   Прочитано: 26947
 +3 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 3
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код...
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 16
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно...
1C и Google Maps 13
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во...
1С Предприятие что это? 10
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который...
COM-подключение к базе 7.7 из 8.2 1С 5
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе="...
Посмотреть все результаты поиска похожих
Комментарии
kuzyara
07.08.2018 12:43Комментарий: 6
kuzyara

Автор шутник ;)

Код 1C v 8.х
 Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
    
    Результат = Новый Структура;
    
    ТекстJSON = СтрЗаменить(ТекстJSON, "\""", """");    // заменим последовательность \" на "


    ТекстJSON = СтрЗаменить(ТекстJSON, """", "");        // а теперь удалим все кавычки


    
    Если Лев(ТекстJSON, 1) = "{" Тогда
        // начало структуры


        ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, "Структура");
        
    ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
        // начало массива


        МассивДанных = Новый Массив;
        ЗаполнитьДанныеИзОтветаJSON(МассивДанных, ТекстJSON, "Массив");
        
        Результат.Вставить("Значение", МассивДанных);
        
    КонецЕсли;
        
    Возврат Результат;
    
КонецФункции


Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)
    
    ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));    // удалим открывающий символ структуры(массива)


    
    НомерЗначения = 0;
    
    Пока ТекстJSON <> "" Цикл
        
        ПервыйСимвол = Лев(ТекстJSON, 1);
        Если ПервыйСимвол = "{" Тогда
            // вложенная структура


            Значение = Новый Структура;
            ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
            
            Если ТипДанных = "Структура" Тогда
                Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
                НомерЗначения = НомерЗначения + 1;
            ИначеЕсли ТипДанных = "Массив" Тогда
                Результат.Добавить(Значение);
            КонецЕсли;
        
        ИначеЕсли ПервыйСимвол = "[" Тогда
            // вложенный массив


            Значение = Новый Массив;
            ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
            
            Если ТипДанных = "Структура" Тогда
                Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
                НомерЗначения = НомерЗначения + 1;
            Иначе
                Результат.Добавить(Значение);
            КонецЕсли;
            
        ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда
            // структура закончилась


            ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            Если Лев(ТекстJSON, 1) = "," Тогда
                ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            КонецЕсли;
            
            Возврат;
            
        ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда
            // массив закончился


            ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            Если Лев(ТекстJSON, 1) = "," Тогда
                ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            КонецЕсли;
            
            Возврат;
            
        Иначе
            
            Если ТипДанных = "Структура" Тогда
                //ПервыйКавычка = Ложь;


                //Если Лев(ТекстJSON, 1) = """" Тогда


                //    ПервыйКавычка = Истина;


                //КонецЕсли;


                
                Поз = Найти(ТекстJSON, ":");
                Если Поз = 0 Тогда
                    // неверный формат, прервемся


                    Прервать;
                КонецЕсли;
                
                //ПредпоследнийКавычка = Ложь;


                //Если Сред(ТекстJSON, Поз - 1, 1) = """" Тогда


                //    ПредпоследнийКавычка = Истина;


                //КонецЕсли;




                
                ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз - 1));
                ИмяЗначения = СтрЗаменить(ИмяЗначения, """", "");
                
                ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));
                                
                Если Лев(ТекстJSON, 1) = "{" Тогда
                    // значение является структурой


                    Значение = Новый Структура;
                    ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
                    
                ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
                    // значение является массивом


                    Значение = Новый Массив;
                    ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
                    
                Иначе
                    // обычное значение


                    ПервыйКавычка = Ложь;
                    ПредпоследнийКавычка = Ложь;
                    Поз = 0;
                    Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
                        Символ = Сред(ТекстJSON, Сч, 1);
                        
                        Если Символ = """" Тогда
                            Если ПервыйКавычка Тогда
                                ПредпоследнийКавычка = Истина;
                            Иначе
                                ПервыйКавычка = Истина;
                            КонецЕсли;                            
                        КонецЕсли;
                        
                        Если (Символ = "," И ((ПервыйКавычка И ПредпоследнийКавычка) Или (Не ПервыйКавычка И Не ПредпоследнийКавычка))) ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
                            Поз = Сч;
                            Прервать;
                        КонецЕсли;
                    КонецЦикла;
                    
                    //ПредпоследнийКавычка = Ложь;


                    //Если Сред(ТекстJSON, Поз - 1, 1) = """" Тогда


                    //    ПредпоследнийКавычка = Истина;


                    //КонецЕсли;


                    
                    Если Поз = 0 Тогда
                        Значение = ТекстJSON;
                        ТекстJSON = "";
                        
                    Иначе
                        Значение = Лев(ТекстJSON, Поз - 1);
                        Значение = СтрЗаменить(Значение, """", "");
                        ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));                        
                    КонецЕсли;
                    
                    Значение = СокрЛП(Значение);
                    
                КонецЕсли;
                
                Результат.Вставить(ИмяЗначения, Значение);
                
            ИначеЕсли ТипДанных = "Массив" Тогда
                
                // обычное значение


                Поз = 0;
                Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
                    Символ = Сред(ТекстJSON, Сч, 1);
                    Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
                        Поз = Сч;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
                
                //ПредпоследнийКавычка = Ложь;


                //Если Сред(ТекстJSON, Поз - 1, 1) = """" Тогда


                //    ПредпоследнийКавычка = Истина;


                //КонецЕсли;


                
                Если Поз = 0 Тогда
                    Значение = ТекстJSON;
                    ТекстJSON = "";
                    
                Иначе
                    Значение = Лев(ТекстJSON, Поз - 1);
                    Значение = СтрЗаменить(Значение, """", "");
                    ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
                    
                КонецЕсли;
                
                Значение = СокрЛП(Значение);
                
                Результат.Добавить(Значение);
                
            КонецЕсли;
                
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры
all4cf
26.02.2015 00:14Комментарий: 5
all4cf

Все функции в статье Обмен данными с сайтом используя формат JSON в 1С, смотрите в самом низу статьи

romedal
08.10.2013 13:24Комментарий: 4
romedal
Автор, где функция !!!???
lest
13.08.2013 16:24Комментарий: 3
lest
Спасибо

У меня вы можете купить лестницу собственного производства от компании СлавДвор
leart_mail
07.08.2013 12:53Комментарий: 2
leart_mail
Это что, сообщение просто похвастаться?
SergDi
02.08.2013 12:39Комментарий: 1
SergDi
так а где сама функция ЗаполнитьСтруктуруИзJSON
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.