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 -> Дерево значений
В ходе обсуждений под публикацией Загрузка 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-структуры это очередной шаг в решении следующих задач по маркировке.
Источник