1с json дерево значений

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

&НаСервере
Функция СформироватьДеревоРекурсия ( МассивДанныхJSON , ТекущееДерево ) //

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПоместитьВДерево ( Текст ) //starik-2005

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

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

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

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

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

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

&НаСервере
Процедура СоздатьДерево ( Кнопка )

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

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

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

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

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

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

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

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

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

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

Источник

JSON -> Дерево значений

  • Строка кода.png
  • Поиск параметра.png
  • 2021-12-21_07-14-20.png
  • рис. Как было.png

В ходе обсуждений под публикацией Загрузка JSON в дерево значений родилась обработка — очередной вариант просмотрщика json-структуры.

От чего хотелось уйти в алгоритме из вышеназванной публикации — если вы посмотрите на результат чтения json-структуры, то заметите повторение узлов — повторение Параметров — и не понятно, то ли это очередной Параметр, то ли это элемент списка (элемент Массива) — см.рис.

В обработке, которая представлена в публикации, подобных вопросов не возникнет — слева вы вставляете текст json, справа видите результат чтения json-структуры в формате дерева значений.

Отличия в новом просмотрщике:

1) не используются файлы — это неудобно для больших файлов, но удобно для отладки процесса чтения json-структуры — вы только копируете содержимое json-файла (через любой текстовый редактор) и вставляете в левое поле обработки. В одном окне видите и json и дерево значений в 1с.

2) дерево значений json-структуры содержит три (!), а не два поля для просмотра и анализа — это Параметр, Значение параметра и Тип параметра (в обработке это ТипЭлемента — отсылка к тому, что это в первую очередь элемент списка, список в json-структуре описывается типом «Массив»).

3) в дерево значений добавляется «служебный» узел с номером индекса — только для элементов Массива — для того, чтобы посмотреть на структуру и сразу понять, что этот узел является элементом Массива, а не узлом очередного Параметра — см. рисунок.

Обновление от 21-12-2021:

1) добавил сохранение текста json, который слева анализируем — при открытии восстанавливается, при закрытии сохраняется.

2) добавил поиск по параметру по дереву — с выделением желтым цветом строки найденного параметра — см. рис.

3) добавил поле «Команда» — по сути это строка кода для вызова и получения значения соответствующего параметра (см. рис. ниже).

Надо учитывать, что переменная Данные — это структура нашего json-текста, которую мы получаем так:

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

Просто скопируйте соответствующую команду в поле согласно стрелке как на рисунке — результат появится справа (кроме случаев Неопределено). Что-то подобное вы видите в конфигураторе в отладчике выражений.

Обработка создана на платформе 1С:Предприятие 8.3 (8.3.18.1289), на пустой конфигурации для _ОбычныхФорм. Для управляемых форм будет реализовано в будущем — подписывайтесь на комментарии — сообщу дополнительно через них.

Небольшое отступление. Исторически сложилось так, что я только что закончил отладку алгоритма построения дерева:

А интерес к json-структуре у меня непосредственный — кто знает, я писал цикл статей по маркировке, в которых использовал xml-формат для ручных операций. Но для операций через АПИ Честного знака надо использовать только json-структуру (!). Поэтому все не зря — анализ разбора json-структуры это очередной шаг в решении следующих задач по маркировке.

Источник

Читайте также:  Чем поливать денежное дерево чтобы оно лучше росло
Оцените статью