1С 8.3 JSON в дерево значений
Данные > Примеры кода 1С > 1С 8.3 HTTP
Перейти в раздел примеры кода 1С 8.3:
Примеры построения дерева из строки JSON для визуализации и анализа данных.
Преобразование JSON в дерево значений в 1С 8.3 (от burni 4):
&НаСервере
Функция СформироватьДеревоРекурсия(МассивДанныхJSON, ТекущееДерево) //
Для Каждого СтрСтруктуры Из МассивДанныхJSON Цикл
Если ТипЗнч(СтрСтруктуры)=Тип("КлючИЗначение") Тогда
ПодчСтрока=ТекущееДерево.Строки.Добавить();
ПодчСтрока.Ключ=СтрСтруктуры.Ключ;
Если ТипЗнч(СтрСтруктуры.Значение)=Тип("Соответствие")
Или ТипЗнч(СтрСтруктуры.Значение)=Тип("Массив") Тогда
СформироватьДеревоРекурсия(СтрСтруктуры.Значение,ПодчСтрока)
Иначе
ПодчСтрока.Значение=СтрСтруктуры.Значение;
КонецЕсли;
ИначеЕсли ТипЗнч(СтрСтруктуры)=Тип("Соответствие")
Или ТипЗнч(СтрСтруктуры)=Тип("Массив") Тогда
ПодчСтрока=ТекущееДерево.Строки.Добавить();
ПодчСтрока.Ключ="";
ПодчСтрока.Значение="[...]";
СформироватьДеревоРекурсия(СтрСтруктуры,ПодчСтрока);
Иначе
ПодчСтрока=ТекущееДерево.Строки.Добавить();
ПодчСтрока.Значение=СтрСтруктуры;
КонецЕсли;
КонецЦикла;
КонецФункции
&НаСервере
Функция ПреобразованиеТекстаJSONвДеревоЗначений(МассивДанныхJSON)
// "НашаСтруктура" - структуры/массивы JSON
// "ТекущееДерево" - строка созданного дерева значений
ДеревоЗначений = Новый ДеревоЗначений;
ДеревоЗначений.Колонки.Добавить("Ключ");
ДеревоЗначений.Колонки.Добавить("Значение");
ВерхнийУровеньДерева=ДеревоЗначений.Строки.Добавить();
ВерхнийУровеньДерева.Ключ="Структура JSON";
СформироватьДеревоРекурсия(МассивДанныхJSON, ВерхнийУровеньДерева);
// Перед вызовом данной рекурсии необходимо создать переменную
// с типо Дерево значений и передать первую строку, в примере,
// что бы она не была пустая, заполняю её текстовым значение "Структура"
КонецФункции
Функция СформироватьДеревоРекурсия(МассивДанныхJSON, ТекущееДерево) //
Для Каждого СтрСтруктуры Из МассивДанныхJSON Цикл
Если ТипЗнч(СтрСтруктуры)=Тип("КлючИЗначение") Тогда
ПодчСтрока=ТекущееДерево.Строки.Добавить();
ПодчСтрока.Ключ=СтрСтруктуры.Ключ;
Если ТипЗнч(СтрСтруктуры.Значение)=Тип("Соответствие")
Или ТипЗнч(СтрСтруктуры.Значение)=Тип("Массив") Тогда
СформироватьДеревоРекурсия(СтрСтруктуры.Значение,ПодчСтрока)
Иначе
ПодчСтрока.Значение=СтрСтруктуры.Значение;
КонецЕсли;
ИначеЕсли ТипЗнч(СтрСтруктуры)=Тип("Соответствие")
Или ТипЗнч(СтрСтруктуры)=Тип("Массив") Тогда
ПодчСтрока=ТекущееДерево.Строки.Добавить();
ПодчСтрока.Ключ="";
ПодчСтрока.Значение="[...]";
СформироватьДеревоРекурсия(СтрСтруктуры,ПодчСтрока);
Иначе
ПодчСтрока=ТекущееДерево.Строки.Добавить();
ПодчСтрока.Значение=СтрСтруктуры;
КонецЕсли;
КонецЦикла;
КонецФункции
&НаСервере
Функция ПреобразованиеТекстаJSONвДеревоЗначений(МассивДанныхJSON)
// "НашаСтруктура" - структуры/массивы JSON
// "ТекущееДерево" - строка созданного дерева значений
ДеревоЗначений = Новый ДеревоЗначений;
ДеревоЗначений.Колонки.Добавить("Ключ");
ДеревоЗначений.Колонки.Добавить("Значение");
ВерхнийУровеньДерева=ДеревоЗначений.Строки.Добавить();
ВерхнийУровеньДерева.Ключ="Структура JSON";
СформироватьДеревоРекурсия(МассивДанныхJSON, ВерхнийУровеньДерева);
// Перед вызовом данной рекурсии необходимо создать переменную
// с типо Дерево значений и передать первую строку, в примере,
// что бы она не была пустая, заполняю её текстовым значение "Структура"
КонецФункции
Преобразование JSON в дерево значений с нумерацией элементов массива в 1С 8.3:
&НаСервере
Функция СформироватьПодстрокиДерева(ИтераторИзJson, ДеревоЗначений, ИндексЭлементаМассива = 0)
Для Каждого Элемент Из ИтераторИзJson Цикл
ПодчСтрока=ДеревоЗначений.Строки.Добавить();
//у типа итератора только два варианта: массив или соответствие
Если ТипЗнч(ИтераторИзJson) = Тип("Массив") Тогда
ПодчСтрока.Ключ = "[" + ИндексЭлементаМассива + "]";
ИндексЭлементаМассива = ИндексЭлементаМассива + 1;
Значение = Элемент;//элементы массива: примитивы, соответствия, массивы
Иначе //итератор - соответствие, элементы - ключ и значение
ПодчСтрока.Ключ = Элемент.Ключ;
Значение = Элемент.Значение;//значения: примитивы, соответствия, массивы
КонецЕсли;
Если ТипЗнч(Значение)=Тип("Соответствие") Тогда
ПодчСтрока.Значение="{" + Значение.Количество() +"}";
ПодчСтрока.Тип = "Запись";
СформироватьПодстрокиДерева(Значение, ПодчСтрока);
ИначеЕсли ТипЗнч(Значение)=Тип("Массив") Тогда
ПодчСтрока.Значение="[" + Значение.Количество() + "]";
ПодчСтрока.Тип = "Массив";
СформироватьПодстрокиДерева(Значение, ПодчСтрока);
Иначе //примитив
ПодчСтрока.Значение=Значение;
ПодчСтрока.Тип = ТипЗнч(Значение);
КонецЕсли;
КонецЦикла;
КонецФункции
&НаСервере
Процедура ЗаполнитьДеревоJSON(ОтветСервера)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветСервера);
СоответствиеИзJson = ПрочитатьJSON(ЧтениеJSON, Истина);
ДеревоЗначений = Новый ДеревоЗначений;
ДеревоЗначений.Колонки.Добавить("Ключ");
ДеревоЗначений.Колонки.Добавить("Значение");
ДеревоЗначений.Колонки.Добавить("Тип");
ВерхнийУровеньДерева = ДеревоЗначений.Строки.Добавить();
ВерхнийУровеньДерева.Ключ = "Дерево JSON";
СформироватьПодстрокиДерева(СоответствиеИзJson, ВерхнийУровеньДерева);
ЗначениеВРеквизитФормы(ДеревоЗначений,"ДеревоJSON");
КонецПроцедуры
Функция СформироватьПодстрокиДерева(ИтераторИзJson, ДеревоЗначений, ИндексЭлементаМассива = 0)
Для Каждого Элемент Из ИтераторИзJson Цикл
ПодчСтрока=ДеревоЗначений.Строки.Добавить();
//у типа итератора только два варианта: массив или соответствие
Если ТипЗнч(ИтераторИзJson) = Тип("Массив") Тогда
ПодчСтрока.Ключ = "[" + ИндексЭлементаМассива + "]";
ИндексЭлементаМассива = ИндексЭлементаМассива + 1;
Значение = Элемент;//элементы массива: примитивы, соответствия, массивы
Иначе //итератор - соответствие, элементы - ключ и значение
ПодчСтрока.Ключ = Элемент.Ключ;
Значение = Элемент.Значение;//значения: примитивы, соответствия, массивы
КонецЕсли;
Если ТипЗнч(Значение)=Тип("Соответствие") Тогда
ПодчСтрока.Значение="{" + Значение.Количество() +"}";
ПодчСтрока.Тип = "Запись";
СформироватьПодстрокиДерева(Значение, ПодчСтрока);
ИначеЕсли ТипЗнч(Значение)=Тип("Массив") Тогда
ПодчСтрока.Значение="[" + Значение.Количество() + "]";
ПодчСтрока.Тип = "Массив";
СформироватьПодстрокиДерева(Значение, ПодчСтрока);
Иначе //примитив
ПодчСтрока.Значение=Значение;
ПодчСтрока.Тип = ТипЗнч(Значение);
КонецЕсли;
КонецЦикла;
КонецФункции
&НаСервере
Процедура ЗаполнитьДеревоJSON(ОтветСервера)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветСервера);
СоответствиеИзJson = ПрочитатьJSON(ЧтениеJSON, Истина);
ДеревоЗначений = Новый ДеревоЗначений;
ДеревоЗначений.Колонки.Добавить("Ключ");
ДеревоЗначений.Колонки.Добавить("Значение");
ДеревоЗначений.Колонки.Добавить("Тип");
ВерхнийУровеньДерева = ДеревоЗначений.Строки.Добавить();
ВерхнийУровеньДерева.Ключ = "Дерево JSON";
СформироватьПодстрокиДерева(СоответствиеИзJson, ВерхнийУровеньДерева);
ЗначениеВРеквизитФормы(ДеревоЗначений,"ДеревоJSON");
КонецПроцедуры
Загрузка JSON в дерево значений в 1С 8.3 (от stаrik-2005):
&НаСервере
Процедура ПоместитьВДерево(Текст) //starik-2005
//Например:
//{"dox":{"tux":{"res":[{
//"part":{"xtd":"320656","godex":{"name":"TE Connectivity"},
//"ibo":[{
//"hado":{"name":"oxford"},"hubos":[{
//[...]
ЧтениеJSON = Новый ЧтениеJSON; //JSON может быть прочитан в структуру или соответствие
ЧтениеJSON.УстановитьСтроку(Текст); // Чтение из строки какого нибудь сервиса
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
ЗначениеВРеквизитФормы(РазвернутьВДерево(РеквизитФормыВЗначение("ТекущееДерево"), ДанныеJSON), "ТекущееДерево");
КонецПроцедуры
&НаСервереБезКонтекста
Функция РазвернутьВДерево(ТекущееДерево, ДанныеJSON, Параметр = "")
Для Каждого СтрСтруктуры Из ДанныеJSON Цикл
Если ТипЗнч(СтрСтруктуры) = Тип("КлючИЗначение") Тогда
ПодчСтрока = ТекущееДерево.Строки.Добавить();
ПодчСтрока.Параметр = СтрСтруктуры.Ключ;
Если ТипЗнч(СтрСтруктуры.Значение) = Тип("Структура")
Или ТипЗнч(СтрСтруктуры.Значение) = Тип("Массив") Тогда
РазвернутьВДерево(ПодчСтрока, СтрСтруктуры.Значение, СтрСтруктуры.Ключ);
Иначе
ПодчСтрока.Значение = СтрСтруктуры.Значение
КонецЕсли;
Иначе
ПодчСтрока = ТекущееДерево.Строки.Добавить();
ПодчСтрока.Параметр = Параметр;
Если ТипЗнч(СтрСтруктуры) = Тип("Структура")
Или ТипЗнч(СтрСтруктуры) = Тип("Массив") Тогда
РазвернутьВДерево(ПодчСтрока, СтрСтруктуры, Параметр);
Иначе
ПодчСтрока.Значение = СтрСтруктуры;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ТекущееДерево
КонецФункции
Процедура ПоместитьВДерево(Текст) //starik-2005
//Например:
//{"dox":{"tux":{"res":[{
//"part":{"xtd":"320656","godex":{"name":"TE Connectivity"},
//"ibo":[{
//"hado":{"name":"oxford"},"hubos":[{
//[...]
ЧтениеJSON = Новый ЧтениеJSON; //JSON может быть прочитан в структуру или соответствие
ЧтениеJSON.УстановитьСтроку(Текст); // Чтение из строки какого нибудь сервиса
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
ЗначениеВРеквизитФормы(РазвернутьВДерево(РеквизитФормыВЗначение("ТекущееДерево"), ДанныеJSON), "ТекущееДерево");
КонецПроцедуры
&НаСервереБезКонтекста
Функция РазвернутьВДерево(ТекущееДерево, ДанныеJSON, Параметр = "")
Для Каждого СтрСтруктуры Из ДанныеJSON Цикл
Если ТипЗнч(СтрСтруктуры) = Тип("КлючИЗначение") Тогда
ПодчСтрока = ТекущееДерево.Строки.Добавить();
ПодчСтрока.Параметр = СтрСтруктуры.Ключ;
Если ТипЗнч(СтрСтруктуры.Значение) = Тип("Структура")
Или ТипЗнч(СтрСтруктуры.Значение) = Тип("Массив") Тогда
РазвернутьВДерево(ПодчСтрока, СтрСтруктуры.Значение, СтрСтруктуры.Ключ);
Иначе
ПодчСтрока.Значение = СтрСтруктуры.Значение
КонецЕсли;
Иначе
ПодчСтрока = ТекущееДерево.Строки.Добавить();
ПодчСтрока.Параметр = Параметр;
Если ТипЗнч(СтрСтруктуры) = Тип("Структура")
Или ТипЗнч(СтрСтруктуры) = Тип("Массив") Тогда
РазвернутьВДерево(ПодчСтрока, СтрСтруктуры, Параметр);
Иначе
ПодчСтрока.Значение = СтрСтруктуры;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ТекущееДерево
КонецФункции
Преобразование JSON в дерево значений в 1С 8.3 (от Rustigsa):
&НаСервере
Процедура СоздатьДерево(Кнопка)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Элементы.ПолеТекстовогоДокумента1.ПолучитьТекст());
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
ДеревоЗначений = Новый ДеревоЗначений;
ДеревоЗначений.Колонки.Добавить("Параметр");
ДеревоЗначений.Колонки.Добавить("Значение");
ДобавитьУзел(ДеревоЗначений, ДанныеJSON);
Элементы.Дерево.СоздатьКолонки();
КонецПроцедуры
&НаСервере
Процедура ДобавитьУзел(ДеревоЗначений, ТекущееДерево)
Для Каждого СтрСтруктуры Из ТекущееДерево Цикл
Если ТипЗнч(ТекущееДерево)=Тип("Структура") Тогда
ПодчУзел = ДеревоЗначений.Строки.Добавить();
ПодчУзел.Параметр = СтрСтруктуры.Ключ;
Если ТипЗнч(СтрСтруктуры.Значение)=Тип("Структура")
Или ТипЗнч(СтрСтруктуры.Значение)=Тип("Массив") Тогда
ДобавитьУзел(ПодчУзел, СтрСтруктуры.Значение);
Иначе
ПодчУзел.Значение = СтрСтруктуры.Значение;
КонецЕсли;
Иначе // Массив
Если ТипЗнч(СтрСтруктуры)=Тип("Структура")
Или ТипЗнч(СтрСтруктуры)=Тип("Массив") Тогда
ДобавитьУзел(ДеревоЗначений, СтрСтруктуры);
Иначе
ПодчУзел.Значение = СтрСтруктуры;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СоздатьДерево(Кнопка)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Элементы.ПолеТекстовогоДокумента1.ПолучитьТекст());
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
ДеревоЗначений = Новый ДеревоЗначений;
ДеревоЗначений.Колонки.Добавить("Параметр");
ДеревоЗначений.Колонки.Добавить("Значение");
ДобавитьУзел(ДеревоЗначений, ДанныеJSON);
Элементы.Дерево.СоздатьКолонки();
КонецПроцедуры
&НаСервере
Процедура ДобавитьУзел(ДеревоЗначений, ТекущееДерево)
Для Каждого СтрСтруктуры Из ТекущееДерево Цикл
Если ТипЗнч(ТекущееДерево)=Тип("Структура") Тогда
ПодчУзел = ДеревоЗначений.Строки.Добавить();
ПодчУзел.Параметр = СтрСтруктуры.Ключ;
Если ТипЗнч(СтрСтруктуры.Значение)=Тип("Структура")
Или ТипЗнч(СтрСтруктуры.Значение)=Тип("Массив") Тогда
ДобавитьУзел(ПодчУзел, СтрСтруктуры.Значение);
Иначе
ПодчУзел.Значение = СтрСтруктуры.Значение;
КонецЕсли;
Иначе // Массив
Если ТипЗнч(СтрСтруктуры)=Тип("Структура")
Или ТипЗнч(СтрСтруктуры)=Тип("Массив") Тогда
ДобавитьУзел(ДеревоЗначений, СтрСтруктуры);
Иначе
ПодчУзел.Значение = СтрСтруктуры;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник