Преобразование текста JSON в дерево значений. УФ (8.3)

Публикация № 823896

Программирование - Инструментарий

Обработка JSON ДеревоЗначений

6
Последнее время часто начал сталкиваться с форматом  JSON, и возникла необходимость быстро анализировать те или иные данные в этом формате, отбрасывая ненужные, но при больших объёмах данных зачастую было сложно разобраться в структуре. Так что это обработка для тех, кто хочет увидеть JSON в читабельном виде (знаю, похожие обработки есть на Инфостарте, но для моих данных они все вываливались с ошибками). Обработка ни на что не претендует и сделана исключительно в целях сэкономить время для анализа JSON.

Обработка преобразовывает JSON в дерево значений. Работает на управляемых формах (8.3.11.2924).

Есть возможности:

  1. выбрать кодировку.
  2. считывать данные напрямую из файла. 
  3. считывать данные по ссылке (GET запрос).
  4. сразу на форме вставлять текст в формате JSON и преобразовывать его.

Из полезного по коду (по моему скромному мнению), вдруг кому пригодится:

Ниже представлен код рекурсивной функции, по преобразованию полученного массива данных JSON штатными средствами ("Новый ЧтениеJSON"), в дерево значений.

&НаСервере
Функция СформироватьДерево(НашаСтруктура,ТекущееДерево)
			
	Для каждого СтрокаСтруктуры из НашаСтруктура цикл	
		Если ТипЗнч(СтрокаСтруктуры)=Тип("КлючИЗначение") тогда
			ПодчиненнаяСтрока=ТекущееДерево.Строки.Добавить();
			ПодчиненнаяСтрока.Ключ=СтрокаСтруктуры.Ключ;	
			
			Если ТипЗнч(СтрокаСтруктуры.Значение)=Тип("Соответствие") или ТипЗнч(СтрокаСтруктуры.Значение)=Тип("Массив")  тогда			
				СформироватьДерево(СтрокаСтруктуры.Значение,ПодчиненнаяСтрока)
			Иначе
				ПодчиненнаяСтрока.Значение=СтрокаСтруктуры.Значение;          
			КонецЕсли;
		ИначеЕсли ТипЗнч(СтрокаСтруктуры)=Тип("Соответствие") или ТипЗнч(СтрокаСтруктуры)=Тип("Массив")  тогда	
				ПодчиненнаяСтрока=ТекущееДерево.Строки.Добавить();
				ПодчиненнаяСтрока.Ключ="";
				ПодчиненнаяСтрока.Значение="[...]";
			   СформироватьДерево(СтрокаСтруктуры,ПодчиненнаяСтрока);
		   Иначе
			ПодчиненнаяСтрока=ТекущееДерево.Строки.Добавить();
			ПодчиненнаяСтрока.Значение=СтрокаСтруктуры;	   
		КонецЕсли;
	КонецЦикла;
	
КонецФункции

 

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

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

 

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

 

Публикация первая, так что сильно не кричите.

6

Скачать файлы

Наименование Файл Версия Размер
Преобразование текста JSON в дерево значений. УФ (8.3):
.epf 8,43Kb
27.02.19
1
.epf 1.0.1 8,43Kb 1 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
2. Fedor02 15.06.18 00:13 Сейчас в теме
Добрый день, вы написал "знаю, похожие обработки есть на Инфостарте, но для моих данных они все вываливались с ошибками" , чем ваша обработка отличается от существующих, и на сколько ваша обработка является универсальной и подходит для данных разной структуры?
3. burni4 5 15.06.18 09:24 Сейчас в теме
(2) что вы подразумеваете под данными разных структур? у JSON одна структура. По поводу обработок на инфостарте, похожую нашел вот эту
https://infostart.ru/public/696196/
и введя свои данные в формате JSON получил ошибку, о чем и отписался в данной теме, поэтому и решил написать свою.
4. uno-c 39 26.02.19 23:21 Сейчас в теме
Правильно ли понял, что Ваша обработка не осилит подобный json из-за ключей с пробелами и начинающихся с цифр? {"12979128":{"сделка":{1с_id":12979128,"менеджер":"v@","способ оплаты":"prepayment","контрагент партнёра": ... " и тд. Не осилит, поскольку преобразует json в структуру для дальнейшей работы.
5. burni4 5 27.02.19 10:29 Сейчас в теме
(4) спасибо за замечание, исправил статью, перезалил обработку.
Оставьте свое сообщение