1С 8.3 JSON в дерево значений - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 JSON в дерево значений

Перейти в раздел примеры кода 1С 8.3:
Примеры построения дерева из строки JSON для визуализации и анализа данных.
Преобразование JSON в дерево значений в 1С 8.3 (от burni 4):
&НаСервере
Функция СформироватьДеревоРекурсия(МассивДанныхJSON, ТекущееДерево)  //

   Для Каждого СтрСтруктуры Из МассивДанныхJSON Цикл
       Если ТипЗнч(СтрСтруктуры)=Тип("КлючИЗначение") Тогда

           ПодчСтрока=ТекущееДерево.Строки.Добавить();
           ПодчСтрока.Ключ=СтрСтруктуры.Ключ;

           Если ТипЗнч(СтрСтруктуры.Значение)=Тип("Соответствие")
               Или ТипЗнч(СтрСтруктуры.Значение)=Тип("Массив") Тогда
               СформироватьДеревоРекурсия(СтрСтруктуры.Значение,ПодчСтрока)
           Иначе
               ПодчСтрока.Значение=СтрСтруктуры.Значение;
           КонецЕсли;

       ИначеЕсли ТипЗнч(СтрСтруктуры)=Тип("Соответствие")
           Или ТипЗнч(СтрСтруктуры)=Тип("Массив") Тогда

           ПодчСтрока=ТекущееДерево.Строки.Добавить();
           ПодчСтрока.Ключ="";
           ПодчСтрока.Значение="[...]";
           СформироватьДеревоРекурсия(СтрСтруктуры,ПодчСтрока);

       Иначе

           ПодчСтрока=ТекущееДерево.Строки.Добавить();
           ПодчСтрока.Значение=СтрСтруктуры;

       КонецЕсли;
   КонецЦикла;

КонецФункции

&НаСервере
Функция ПреобразованиеТекстаJSONвДеревоЗначений(МассивДанныхJSON)

   // "НашаСтруктура" - структуры/массивы JSON
   // "ТекущееДерево" - строка созданного дерева значений

   ДеревоЗначений = Новый ДеревоЗначений;
   ДеревоЗначений.Колонки.Добавить("Ключ");
   ДеревоЗначений.Колонки.Добавить("Значение");

   ВерхнийУровеньДерева=ДеревоЗначений.Строки.Добавить();
   ВерхнийУровеньДерева.Ключ="Структура JSON";
   СформироватьДеревоРекурсия(МассивДанныхJSON, ВерхнийУровеньДерева);

   // Перед вызовом данной рекурсии необходимо создать переменную
   // с типо Дерево значений и передать первую строку, в примере,
   // что бы она не была пустая, заполняю её текстовым значение "Структура"

КонецФункции
Преобразование JSON в дерево значений с нумерацией элементов массива в 1С 8.3:
&НаСервере
Функция СформироватьПодстрокиДерева(ИтераторИзJson, ДеревоЗначений, ИндексЭлементаМассива = 0)
   Для Каждого Элемент Из ИтераторИзJson Цикл

       ПодчСтрока=ДеревоЗначений.Строки.Добавить();
       //у типа итератора только два варианта: массив или соответствие
       Если ТипЗнч(ИтераторИзJson) = Тип("Массив") Тогда
           ПодчСтрока.Ключ = "[" + ИндексЭлементаМассива + "]";
           ИндексЭлементаМассива = ИндексЭлементаМассива + 1;
           Значение = Элемент;//элементы массива: примитивы, соответствия, массивы
       Иначе //итератор - соответствие, элементы - ключ и значение
           ПодчСтрока.Ключ = Элемент.Ключ;
           Значение = Элемент.Значение;//значения: примитивы, соответствия, массивы
       КонецЕсли;

       Если ТипЗнч(Значение)=Тип("Соответствие") Тогда
           ПодчСтрока.Значение="{" + Значение.Количество() +"}";
           ПодчСтрока.Тип = "Запись";
           СформироватьПодстрокиДерева(Значение, ПодчСтрока);
       ИначеЕсли ТипЗнч(Значение)=Тип("Массив") Тогда
           ПодчСтрока.Значение="[" + Значение.Количество() + "]";
           ПодчСтрока.Тип = "Массив";
           СформироватьПодстрокиДерева(Значение, ПодчСтрока);
       Иначе //примитив
           ПодчСтрока.Значение=Значение;
           ПодчСтрока.Тип = ТипЗнч(Значение);
       КонецЕсли;

   КонецЦикла;
КонецФункции

&НаСервере
Процедура ЗаполнитьДеревоJSON(ОтветСервера)

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

   ДеревоЗначений = Новый ДеревоЗначений;
   ДеревоЗначений.Колонки.Добавить("Ключ");
   ДеревоЗначений.Колонки.Добавить("Значение");
   ДеревоЗначений.Колонки.Добавить("Тип");
   ВерхнийУровеньДерева = ДеревоЗначений.Строки.Добавить();
   ВерхнийУровеньДерева.Ключ = "Дерево JSON";
   СформироватьПодстрокиДерева(СоответствиеИзJson, ВерхнийУровеньДерева);
   ЗначениеВРеквизитФормы(ДеревоЗначений,"ДеревоJSON");

КонецПроцедуры
Загрузка JSON в дерево значений в 1С 8.3 (от stаrik-2005):
&НаСервере
Процедура ПоместитьВДерево(Текст) //starik-2005

   //Например:
   //{"dox":{"tux":{"res":[{
   //"part":{"xtd":"320656","godex":{"name":"TE Connectivity"},
   //"ibo":[{
   //"hado":{"name":"oxford"},"hubos":[{
   //[...]

   ЧтениеJSON = Новый ЧтениеJSON; //JSON может быть прочитан в структуру или соответствие
   ЧтениеJSON.УстановитьСтроку(Текст); // Чтение из строки какого нибудь сервиса
   ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);

   ЗначениеВРеквизитФормы(РазвернутьВДерево(РеквизитФормыВЗначение("ТекущееДерево"), ДанныеJSON), "ТекущееДерево");

КонецПроцедуры

&НаСервереБезКонтекста
Функция РазвернутьВДерево(ТекущееДерево, ДанныеJSON, Параметр = "")

   Для Каждого СтрСтруктуры Из ДанныеJSON Цикл
       Если ТипЗнч(СтрСтруктуры) = Тип("КлючИЗначение") Тогда

           ПодчСтрока = ТекущееДерево.Строки.Добавить();
           ПодчСтрока.Параметр = СтрСтруктуры.Ключ;
           Если ТипЗнч(СтрСтруктуры.Значение) = Тип("Структура")
               Или ТипЗнч(СтрСтруктуры.Значение) = Тип("Массив") Тогда
               РазвернутьВДерево(ПодчСтрока, СтрСтруктуры.Значение, СтрСтруктуры.Ключ);
           Иначе
               ПодчСтрока.Значение =  СтрСтруктуры.Значение
           КонецЕсли;

       Иначе

           ПодчСтрока = ТекущееДерево.Строки.Добавить();
           ПодчСтрока.Параметр = Параметр;
           Если ТипЗнч(СтрСтруктуры) = Тип("Структура")
               Или ТипЗнч(СтрСтруктуры) = Тип("Массив") Тогда
               РазвернутьВДерево(ПодчСтрока, СтрСтруктуры, Параметр);
           Иначе
               ПодчСтрока.Значение =  СтрСтруктуры;
           КонецЕсли;

       КонецЕсли;
   КонецЦикла;

   Возврат ТекущееДерево

КонецФункции
Преобразование JSON в дерево значений в 1С 8.3 (от Rustigsa):
&НаСервере
Процедура СоздатьДерево(Кнопка)

   ЧтениеJSON = Новый ЧтениеJSON;
   ЧтениеJSON.УстановитьСтроку(Элементы.ПолеТекстовогоДокумента1.ПолучитьТекст());
   ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);

   ДеревоЗначений = Новый ДеревоЗначений;
   ДеревоЗначений.Колонки.Добавить("Параметр");
   ДеревоЗначений.Колонки.Добавить("Значение");

   ДобавитьУзел(ДеревоЗначений, ДанныеJSON);

   Элементы.Дерево.СоздатьКолонки();

КонецПроцедуры

&НаСервере
Процедура ДобавитьУзел(ДеревоЗначений, ТекущееДерево)

   Для Каждого СтрСтруктуры Из ТекущееДерево Цикл

       Если ТипЗнч(ТекущееДерево)=Тип("Структура") Тогда

           ПодчУзел = ДеревоЗначений.Строки.Добавить();
           ПодчУзел.Параметр = СтрСтруктуры.Ключ;

           Если ТипЗнч(СтрСтруктуры.Значение)=Тип("Структура")
               Или ТипЗнч(СтрСтруктуры.Значение)=Тип("Массив") Тогда
               ДобавитьУзел(ПодчУзел, СтрСтруктуры.Значение);
           Иначе
               ПодчУзел.Значение = СтрСтруктуры.Значение;
           КонецЕсли;

       Иначе // Массив

           Если ТипЗнч(СтрСтруктуры)=Тип("Структура")
               Или ТипЗнч(СтрСтруктуры)=Тип("Массив") Тогда
               ДобавитьУзел(ДеревоЗначений, СтрСтруктуры);
           Иначе
               ПодчУзел.Значение = СтрСтруктуры;
           КонецЕсли;

       КонецЕсли;

   КонецЦикла;

КонецПроцедуры
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 16.01.2022
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому