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 86 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 86 03.06.19 07:46 Сейчас в теме
вот так с нумерацией элементов массива:
&НаСервере
Функция СформироватьПодстрокиДерева(ИтераторИзJson, ТекущаяСтрокаДерева, ИндексЭлементаМассива = 0)
	Для каждого Элемент из ИтераторИзJson цикл	
		ДочерняяСтрокаДерева=ТекущаяСтрокаДерева.Строки.Добавить();
		//у типа итератора только два варианта: массив или соответствие
		Если ТипЗнч(ИтераторИзJson) = Тип("Массив") Тогда 
			ДочерняяСтрокаДерева.Ключ = "[" + ИндексЭлементаМассива + "]";
			ИндексЭлементаМассива = ИндексЭлементаМассива + 1;
			Значение = Элемент;//элементы массива: примитивы, соответствия, массивы
		Иначе //итератор - соответствие, элементы - ключ и значение
			ДочерняяСтрокаДерева.Ключ = Элемент.Ключ;
			Значение = Элемент.Значение;//значения: примитивы, соответствия, массивы
		КонецЕсли;
		Если ТипЗнч(Значение)=Тип("Соответствие") Тогда
			ДочерняяСтрокаДерева.Значение="{" + Значение.Количество() +"}";
			ДочерняяСтрокаДерева.Тип = "Запись";
			СформироватьПодстрокиДерева(Значение, ДочерняяСтрокаДерева);
		ИначеЕсли ТипЗнч(Значение)=Тип("Массив") Тогда
			ДочерняяСтрокаДерева.Значение="[" + Значение.Количество() + "]";
			ДочерняяСтрокаДерева.Тип = "Массив";
			СформироватьПодстрокиДерева(Значение, ДочерняяСтрокаДерева);
		Иначе //примитив
			ДочерняяСтрокаДерева.Значение=Значение;
			ДочерняяСтрокаДерева.Тип = ТипЗнч(Значение);
		КонецЕсли;
	КонецЦикла;
КонецФункции

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

Вакансии

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

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

Программист 1С
Нижний Новгород
зарплата от 80 000 руб. до 130 000 руб.
Полный день

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

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