Загрузка JSON в дерево значений

0. starik-2005 2834 29.06.21 16:00 Сейчас в теме
Читаем и парсим JSON, засовываем его в дерево - что тут сложного?

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. aleksey2 83 30.06.21 08:15 Сейчас в теме
начиная с платформы 8.3.6.1977
2. ITSun 28.07.21 08:23 Сейчас в теме
Тренируетесь?

Физкультура - это хорошо!
И рейтинг опять же.
3. starik-2005 2834 28.07.21 11:53 Сейчас в теме
(2)
Тренируетесь
Типа того. Реакция на одного неадеквата в действительности.
5. RustIG 1693 02.12.21 01:13 Сейчас в теме
кажется дерево содержит лишние узлы - см. картинку
Прикрепленные файлы:
7. starik-2005 2834 02.12.21 23:30 Сейчас в теме
6. RustIG 1693 02.12.21 14:13 Сейчас в теме
создание дерева через рекурсию
Процедура СоздатьДерево(Кнопка)
	
	Чтение = Новый ЧтениеJSON;
	Чтение.УстановитьСтроку(ЭлементыФормы.ПолеТекстовогоДокумента1.ПолучитьТекст());
	Данные = ПрочитатьJSON(Чтение);
	
	Дерево = Новый ДеревоЗначений;
	Дерево.Колонки.Добавить("Параметр");
	Дерево.Колонки.Добавить("Значение");
	
	ТекУзел = Дерево;
		
	ДобавитьУзел(ТекУзел, Данные);
	
	ЭлементыФормы.Дерево.СоздатьКолонки();	

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

Процедура ДобавитьУзел(ТекУзел, СтруктураДерева)
		
	Для Каждого ЭлСтруктуры Из СтруктураДерева Цикл
		
		Если ТипЗнч(СтруктураДерева)=Тип("Структура") Тогда			
 
			ПодчиненныйУзел = ТекУзел.Строки.Добавить();
			ПодчиненныйУзел.Параметр = ЭлСтруктуры.Ключ;
			
			Если ТипЗнч(ЭлСтруктуры.Значение)=Тип("Структура") 
				ИЛИ ТипЗнч(ЭлСтруктуры.Значение)=Тип("Массив") Тогда
				ДобавитьУзел(ПодчиненныйУзел, ЭлСтруктуры.Значение);
			Иначе
				ПодчиненныйУзел.Значение = ЭлСтруктуры.Значение;
			КонецЕсли; 		
			
		Иначе //массив
			
			//ПодчиненныйУзел = ТекУзел.Строки.Добавить();
			//ПодчиненныйУзел.Параметр = ЭлСтруктуры;
			
			Если ТипЗнч(ЭлСтруктуры)=Тип("Структура") 
				ИЛИ ТипЗнч(ЭлСтруктуры)=Тип("Массив") Тогда
				ДобавитьУзел(ТекУзел, ЭлСтруктуры);
			Иначе
				ПодчиненныйУзел.Значение = ЭлСтруктуры;
			КонецЕсли; 		
			
		КонецЕсли;
			
	КонецЦикла;
		
КонецПроцедуры
Показать
Прикрепленные файлы:
8. miXna5 72 06.12.21 17:08 Сейчас в теме
(6) У вас добавляются только узлы 1 уровня. Если подчиненность идет дальше, будет выводиться неверно (без вложенности). У автора поста отрабатывает нормально.
9. RustIG 1693 06.12.21 18:33 Сейчас в теме
10. miXna5 72 20.12.21 14:25 Сейчас в теме
(9) Вот пример. На прикрепленных скриншотах результат выполнения по методу автора и по вашему.
По методу автора массив элементов, которые состоят в свою очередь из объектов разложится наглядно в структуры, а по вашей процедуре свойства объектов в массиве будут выводится общим списком, что не наглядно.
Дело как раз в двух закомментированных строках.
Прикрепленные файлы:
11. RustIG 1693 20.12.21 15:08 Сейчас в теме
(10) можете прислать файл json? хочу сам отладить
12. miXna5 72 20.12.21 16:16 Сейчас в теме
(11) Мне это API портала "Электронный знак" (Белорусский аналог Честного знака) возвращает. Сохранил в файл.
Прикрепленные файлы:
Пример.json
13. RustIG 1693 20.12.21 18:13 Сейчас в теме
(12) спасибо.
разобрался.
моей целью было - как можно точнее отобразить содержимое файла джейсон
вот сравните результат моего алгоритма и содержимое файла джейсон
Прикрепленные файлы:
14. RustIG 1693 20.12.21 18:24 Сейчас в теме
(12) один файл джейсон можно сгенерировать несколькими алгоритмами, при этом несколько по-разному связанных таблиц в базе данных можно отобразить одним и тем же файлом джейсон.... файл джейсон призван передать в сжатом виде информацию только в одну сторону. Каким образом расшифровывать полученный файл - это уже задача интерпретатора, и можно использовать как алгоритм Сергея Андреева, так и мой вариант. В его алгоритме надо "держать в уме" что повторяющиеся узлы "params" - это не элемент структуры, а очередной элемент списка (!)...
В моем варианте нужно "держать в уме" что повторяющиеся элементы списка не обрамлены структурно в узлы, а идут последовательно друг за другом....
Это как расшифровка xml-файла - алгоритм расшифровки всегда уникален и индивидуален.
Вообще,я думаю, можно найти золотую середину - компромисс - использовать алгоритм варианта 3 (!) - мы структурно выделяем элементы списка, но в названии узла используем префикс или суффикс - отличающий наш "1с-овский" узел - например "params1","params2", "params3", "держа в уме" что одноименные параметры - это всегда элементы списка, а номер параметра это порядковый номер...
15. RustIG 1693 20.12.21 18:45 Сейчас в теме
(12) или еще вариант - мы все привыкли что для отображения джейсон -структуры можно использовать Дерево с двумя полями (!):
 Дерево = Новый ДеревоЗначений;
	Дерево.Колонки.Добавить("Параметр");
	Дерево.Колонки.Добавить("Значение");

Я предлагаю использовать три поля - добавить еще "ТипЭлемента": значениями будут "УзелСтруктуры" или "ЭлементСписка" ("ЭлементМассива"):

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

Это для моего варианта алгоритма и для варианта Сергея Андреева - будет полезно, чтобы была однозначная интерпретация.
16. RustIG 1693 20.12.21 18:49 Сейчас в теме
(12) в целом , спасибо за активное участие! я для себя понял гораздо больше нюансов джейсон-структур.
17. RustIG 1693 20.12.21 19:33 Сейчас в теме
(12) готово!
вот код:
Процедура СоздатьДерево(Кнопка)
	
	Чтение = Новый ЧтениеJSON;
	Чтение.УстановитьСтроку(ЭлементыФормы.ПолеТекстовогоДокумента1.ПолучитьТекст());
	Данные = ПрочитатьJSON(Чтение);
	
	//Для Каждого Ст ИЗ Данные Цикл 
	//	Если ТипЗнч(Ст) = Тип("КлючИЗначение") Тогда 
	//		Строка = Дерево.Строки.Добавить();
	//		Строка.Параметр = Ст.Ключ;
	//		Если ТипЗнч(Ст.Значение) = Тип("Структура") 
	//			ИЛИ ТипЗнч(Ст.Значение) = Тип("Массив") Тогда 
	//			РазвернутьВДерево( Строка, Ст.Значение, Ст.Ключ );
	//		Иначе
	//			Строка.Значение =  Ст.Значение
	//		КонецЕсли;
	//	Иначе
	//		Строка = Дерево.Строки.Добавить();
	//		Строка.Параметр = Параметр;
	//		Если ТипЗнч(Ст) = Тип("Структура") 
	//			ИЛИ ТипЗнч(Ст) = Тип("Массив") Тогда 
	//			РазвернутьВДерево( Строка, Ст, Параметр );
	//		Иначе
	//			Строка.Значение =  Ст
	//		КонецЕсли;
	//	КонецЕсли;
	//КонецЦикла;	

	Дерево = Новый ДеревоЗначений;
	Дерево.Колонки.Добавить("Параметр");
	Дерево.Колонки.Добавить("Значение");
	Дерево.Колонки.Добавить("ТипЭлемента");
	
	ТекУзел = Дерево;
		
	ДобавитьУзел(ТекУзел, Данные);
	
	ЭлементыФормы.Дерево.СоздатьКолонки();	

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

Процедура ДобавитьУзел(ТекУзел, СтруктураДерева, ТипЭлемента = "")
		
	Для Каждого ЭлСтруктуры Из СтруктураДерева Цикл
		
		Если ТипЗнч(СтруктураДерева)=Тип("Структура") Тогда			
			
			ТипЭлемента = ТипЗнч(ЭлСтруктуры.Значение);
			
			ПодчиненныйУзел = ТекУзел.Строки.Добавить();
			ПодчиненныйУзел.Параметр = ЭлСтруктуры.Ключ;
			ПодчиненныйУзел.ТипЭлемента = ТипЭлемента;
			
			Если ТипЭлемента=Тип("Структура") ИЛИ ТипЭлемента=Тип("Массив") Тогда
				ДобавитьУзел(ПодчиненныйУзел, ЭлСтруктуры.Значение, ТипЭлемента);
			Иначе
				ПодчиненныйУзел.Значение = ЭлСтруктуры.Значение;
			КонецЕсли; 		
			
		Иначе //массив
			
			ТипЭлемента = ТипЗнч(ЭлСтруктуры);
			
			ПодчиненныйУзел = ТекУзел.Строки.Добавить();
			ПодчиненныйУзел.Параметр = "" + ЭлСтруктуры + СтруктураДерева.Найти(ЭлСтруктуры);
			ПодчиненныйУзел.ТипЭлемента = ТипЭлемента;    			

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

Показать


результат в картинках
Прикрепленные файлы:
Оставьте свое сообщение
Вакансии
Системный архитектор 1С
Москва
зарплата от 250 000 руб.
Полный день

Функциональный архитектор
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С
Москва
зарплата от 250 000 руб. до 300 000 руб.
Полный день

Консультант 1С
Москва
зарплата от 80 000 руб. до 150 000 руб.
Полный день

Аналитик 1C
Москва
зарплата от 120 000 руб. до 250 000 руб.
Полный день