Комментарии
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
создание дерева через рекурсию
Процедура СоздатьДерево(Кнопка)
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ЭлементыФормы.ПолеТекстовогоДокумента1.ПолучитьТекст());
Данные = ПрочитатьJSON(Чтение);
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Параметр");
Дерево.Колонки.Добавить("Значение");
ТекУзел = Дерево;
ДобавитьУзел(ТекУзел, Данные);
ЭлементыФормы.Дерево.СоздатьКолонки();
КонецПроцедуры
Процедура ДобавитьУзел(ТекУзел, СтруктураДерева)
Для Каждого ЭлСтруктуры Из СтруктураДерева Цикл
Если ТипЗнч(СтруктураДерева)=Тип("Структура") Тогда
ПодчиненныйУзел = ТекУзел.Строки.Добавить();
ПодчиненныйУзел.Параметр = ЭлСтруктуры.Ключ;
Если ТипЗнч(ЭлСтруктуры.Значение)=Тип("Структура")
ИЛИ ТипЗнч(ЭлСтруктуры.Значение)=Тип("Массив") Тогда
ДобавитьУзел(ПодчиненныйУзел, ЭлСтруктуры.Значение);
Иначе
ПодчиненныйУзел.Значение = ЭлСтруктуры.Значение;
КонецЕсли;
Иначе //массив
//ПодчиненныйУзел = ТекУзел.Строки.Добавить();
//ПодчиненныйУзел.Параметр = ЭлСтруктуры;
Если ТипЗнч(ЭлСтруктуры)=Тип("Структура")
ИЛИ ТипЗнч(ЭлСтруктуры)=Тип("Массив") Тогда
ДобавитьУзел(ТекУзел, ЭлСтруктуры);
Иначе
ПодчиненныйУзел.Значение = ЭлСтруктуры;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьПрикрепленные файлы:
(9) Вот пример. На прикрепленных скриншотах результат выполнения по методу автора и по вашему.
По методу автора массив элементов, которые состоят в свою очередь из объектов разложится наглядно в структуры, а по вашей процедуре свойства объектов в массиве будут выводится общим списком, что не наглядно.
Дело как раз в двух закомментированных строках.
По методу автора массив элементов, которые состоят в свою очередь из объектов разложится наглядно в структуры, а по вашей процедуре свойства объектов в массиве будут выводится общим списком, что не наглядно.
Дело как раз в двух закомментированных строках.
Прикрепленные файлы:
(11) Мне это API портала "Электронный знак" (Белорусский аналог Честного знака) возвращает. Сохранил в файл.
Прикрепленные файлы:
Пример.json
(12) один файл джейсон можно сгенерировать несколькими алгоритмами, при этом несколько по-разному связанных таблиц в базе данных можно отобразить одним и тем же файлом джейсон.... файл джейсон призван передать в сжатом виде информацию только в одну сторону. Каким образом расшифровывать полученный файл - это уже задача интерпретатора, и можно использовать как алгоритм Сергея Андреева, так и мой вариант. В его алгоритме надо "держать в уме" что повторяющиеся узлы "params" - это не элемент структуры, а очередной элемент списка (!)...
В моем варианте нужно "держать в уме" что повторяющиеся элементы списка не обрамлены структурно в узлы, а идут последовательно друг за другом....
Это как расшифровка xml-файла - алгоритм расшифровки всегда уникален и индивидуален.
Вообще,я думаю, можно найти золотую середину - компромисс - использовать алгоритм варианта 3 (!) - мы структурно выделяем элементы списка, но в названии узла используем префикс или суффикс - отличающий наш "1с-овский" узел - например "params1","params2", "params3", "держа в уме" что одноименные параметры - это всегда элементы списка, а номер параметра это порядковый номер...
В моем варианте нужно "держать в уме" что повторяющиеся элементы списка не обрамлены структурно в узлы, а идут последовательно друг за другом....
Это как расшифровка xml-файла - алгоритм расшифровки всегда уникален и индивидуален.
Вообще,я думаю, можно найти золотую середину - компромисс - использовать алгоритм варианта 3 (!) - мы структурно выделяем элементы списка, но в названии узла используем префикс или суффикс - отличающий наш "1с-овский" узел - например "params1","params2", "params3", "держа в уме" что одноименные параметры - это всегда элементы списка, а номер параметра это порядковый номер...
(12) или еще вариант - мы все привыкли что для отображения джейсон -структуры можно использовать Дерево с двумя полями (!):
Я предлагаю использовать три поля - добавить еще "ТипЭлемента": значениями будут "УзелСтруктуры" или "ЭлементСписка" ("ЭлементМассива"):
Это для моего варианта алгоритма и для варианта Сергея Андреева - будет полезно, чтобы была однозначная интерпретация.
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Параметр");
Дерево.Колонки.Добавить("Значение");
Я предлагаю использовать три поля - добавить еще "ТипЭлемента": значениями будут "УзелСтруктуры" или "ЭлементСписка" ("ЭлементМассива"):
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Параметр");
Дерево.Колонки.Добавить("Значение");
Дерево.Колонки.Добавить("ТипЭлемента");
Это для моего варианта алгоритма и для варианта Сергея Андреева - будет полезно, чтобы была однозначная интерпретация.
(12) готово!
вот код:
результат в картинках
вот код:
Процедура СоздатьДерево(Кнопка)
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ЭлементыФормы.ПолеТекстовогоДокумента1.ПолучитьТекст());
Данные = ПрочитатьJSON(Чтение);
//Для Каждого Ст ИЗ Данные Цикл
// Если ТипЗнч(Ст) = Тип("КлючИЗначение") Тогда
// Строка = Дерево.Строки.Добавить();
// Строка.Параметр = Ст.Ключ;
// Если ТипЗнч(Ст.Значение) = Тип("Структура")
// ИЛИ ТипЗнч(Ст.Значение) = Тип("Массив") Тогда
// РазвернутьВДерево( Строка, Ст.Значение, Ст.Ключ );
// Иначе
// Строка.Значение = Ст.Значение
// КонецЕсли;
// Иначе
// Строка = Дерево.Строки.Добавить();
// Строка.Параметр = Параметр;
// Если ТипЗнч(Ст) = Тип("Структура")
// ИЛИ ТипЗнч(Ст) = Тип("Массив") Тогда
// РазвернутьВДерево( Строка, Ст, Параметр );
// Иначе
// Строка.Значение = Ст
// КонецЕсли;
// КонецЕсли;
//КонецЦикла;
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Параметр");
Дерево.Колонки.Добавить("Значение");
Дерево.Колонки.Добавить("ТипЭлемента");
ТекУзел = Дерево;
ДобавитьУзел(ТекУзел, Данные);
ЭлементыФормы.Дерево.СоздатьКолонки();
КонецПроцедуры
Процедура ДобавитьУзел(ТекУзел, СтруктураДерева, ТипЭлемента = "")
Для Каждого ЭлСтруктуры Из СтруктураДерева Цикл
Если ТипЗнч(СтруктураДерева)=Тип("Структура") Тогда
ТипЭлемента = ТипЗнч(ЭлСтруктуры.Значение);
ПодчиненныйУзел = ТекУзел.Строки.Добавить();
ПодчиненныйУзел.Параметр = ЭлСтруктуры.Ключ;
ПодчиненныйУзел.ТипЭлемента = ТипЭлемента;
Если ТипЭлемента=Тип("Структура") ИЛИ ТипЭлемента=Тип("Массив") Тогда
ДобавитьУзел(ПодчиненныйУзел, ЭлСтруктуры.Значение, ТипЭлемента);
Иначе
ПодчиненныйУзел.Значение = ЭлСтруктуры.Значение;
КонецЕсли;
Иначе //массив
ТипЭлемента = ТипЗнч(ЭлСтруктуры);
ПодчиненныйУзел = ТекУзел.Строки.Добавить();
ПодчиненныйУзел.Параметр = "" + ЭлСтруктуры + СтруктураДерева.Найти(ЭлСтруктуры);
ПодчиненныйУзел.ТипЭлемента = ТипЭлемента;
Если ТипЭлемента=Тип("Структура") ИЛИ ТипЭлемента=Тип("Массив") Тогда
ДобавитьУзел(ТекУзел, ЭлСтруктуры, ТипЭлемента);
Иначе
ПодчиненныйУзел.Значение = ЭлСтруктуры;
ПодчиненныйУзел.ТипЭлемента = ТипЭлемента;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показатьрезультат в картинках
Прикрепленные файлы: