0. burni4 7 26.04.18 15:30 Сейчас в теме

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

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

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

Комментарии
Избранное Подписка Сортировка: Древо
2. Fedor02 15.06.18 00:13 Сейчас в теме
Добрый день, вы написал "знаю, похожие обработки есть на Инфостарте, но для моих данных они все вываливались с ошибками" , чем ваша обработка отличается от существующих, и на сколько ваша обработка является универсальной и подходит для данных разной структуры?
3. burni4 7 15.06.18 09:24 Сейчас в теме
(2) что вы подразумеваете под данными разных структур? у JSON одна структура. По поводу обработок на инфостарте, похожую нашел вот эту
https://infostart.ru/public/696196/
и введя свои данные в формате JSON получил ошибку, о чем и отписался в данной теме, поэтому и решил написать свою.
4. uno-c 103 26.02.19 23:21 Сейчас в теме
Правильно ли понял, что Ваша обработка не осилит подобный json из-за ключей с пробелами и начинающихся с цифр? {"12979128":{"сделка":{1с_id":12979128,"менеджер":"v@","способ оплаты":"prepayment","контрагент партнёра": ... " и тд. Не осилит, поскольку преобразует json в структуру для дальнейшей работы.
5. burni4 7 27.02.19 10:29 Сейчас в теме
(4) спасибо за замечание, исправил статью, перезалил обработку.
6. uno-c 103 03.06.19 07:46 Сейчас в теме
вот так с нумерацией элементов массива:
&НаСервере
Функция СформироватьПодстрокиДерева(ИтераторИзJson, ТекущаяСтрокаДерева, ИндексЭлементаМассива = 0)
	Для каждого Элемент из ИтераторИзJson цикл	
		ДочерняяСтрокаДерева=ТекущаяСтрокаДерева.Строки.Добавить();
		//у типа итератора только два варианта: массив или соответствие
		Если ТипЗнч(ИтераторИзJson) = Тип("Массив") Тогда 
			ДочерняяСтрокаДерева.Ключ = "[" + ИндексЭлементаМассива + "]";
			ИндексЭлементаМассива = ИндексЭлементаМассива + 1;
			Значение = Элемент;//элементы массива: примитивы, соответствия, массивы
		Иначе //итератор - соответствие, элементы - ключ и значение
			ДочерняяСтрокаДерева.Ключ = Элемент.Ключ;
			Значение = Элемент.Значение;//значения: примитивы, соответствия, массивы
		КонецЕсли;
		Если ТипЗнч(Значение)=Тип("Соответствие") Тогда
			ДочерняяСтрокаДерева.Значение="{" + Значение.Количество() +"}";
			ДочерняяСтрокаДерева.Тип = "Запись";
			СформироватьПодстрокиДерева(Значение, ДочерняяСтрокаДерева);
		ИначеЕсли ТипЗнч(Значение)=Тип("Массив") Тогда
			ДочерняяСтрокаДерева.Значение="[" + Значение.Количество() + "]";
			ДочерняяСтрокаДерева.Тип = "Массив";
			СформироватьПодстрокиДерева(Значение, ДочерняяСтрокаДерева);
		Иначе //примитив
			ДочерняяСтрокаДерева.Значение=Значение;
			ДочерняяСтрокаДерева.Тип = ТипЗнч(Значение);
		КонецЕсли;
	КонецЦикла;
КонецФункции

&НаСервере
Процедура ЗаполнитьДеревоЖсон()
	ЧтениеЖсон = Новый ЧтениеJSON;
	ЧтениеЖсон.УстановитьСтроку(ОтветСервера);
	СоответствиеИзJson = ПрочитатьJSON(ЧтениеЖсон, Истина);
	
	Дерево= новый ДеревоЗначений;
	Дерево.Колонки.Добавить("Ключ");
	Дерево.Колонки.Добавить("Значение");
	Дерево.Колонки.Добавить("Тип");
	ВерхнийУровеньдерева=Дерево.Строки.Добавить();
	ВерхнийУровеньдерева.Ключ="Дерево JSON";    
	СформироватьПодстрокиДерева(СоответствиеИзJson, ВерхнийУровеньдерева);
	ЗначениеВРеквизитФормы(Дерево,"ДеревоЖсон");
КонецПроцедуры
Показать
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Технический лидер, архитектор 1С, руководитель проектов
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

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

Консультант-аналитик 1С
Рязань
зарплата до 80 000 руб.
Полный день