2024-04-09 15:35:11 +02:00
|
|
|
Перем МаксимальнаяВложенность;
|
2024-04-09 19:27:46 +02:00
|
|
|
Перем ИскомыйПараметр;
|
2024-04-09 15:35:11 +02:00
|
|
|
|
|
|
|
#Область СлужебныйПрограммныйИнтерфейс
|
2024-04-09 19:27:46 +02:00
|
|
|
|
|
|
|
// Разложить JSON на параметры
|
|
|
|
// Показывает значения, которые можно получить из переданного JSON и возвращает
|
|
|
|
// конкретное значение при указании имени поля
|
|
|
|
//
|
|
|
|
// Параметры:
|
2024-04-09 19:36:29 +02:00
|
|
|
// JSON - Строка - JSON данные - json
|
|
|
|
// МаксимальныйУровеньВложенности - Строка - Ограничение на уровень вложенности разбора. На всю глубину по умолчанию - nesting
|
|
|
|
// ИмяПараметра - Строка - Имя поля для получения. Выводит список доступных, если не указано - name
|
|
|
|
//
|
|
|
|
// Возвращаемое значение:
|
|
|
|
// Строка - пустая строка
|
2024-04-09 19:27:46 +02:00
|
|
|
Процедура РазложитьJSONНаПараметры(Знач JSON, Знач МаксимальныйУровеньВложенности = 0, Знач ИмяПараметра = "") Экспорт
|
2024-04-09 15:35:11 +02:00
|
|
|
|
|
|
|
МаксимальнаяВложенность = МаксимальныйУровеньВложенности;
|
2024-04-09 19:27:46 +02:00
|
|
|
ИскомыйПараметр = ИмяПараметра;
|
2024-04-09 15:35:11 +02:00
|
|
|
|
|
|
|
Если ТипЗнч(JSON) = Тип("Строка") Тогда
|
|
|
|
НормализоватьТекстовыйВвод(JSON);
|
|
|
|
КонецЕсли;
|
|
|
|
|
|
|
|
ПолучитьКоллекцию(JSON);
|
|
|
|
|
|
|
|
Если Не ТипЗнч(JSON) = Тип("Соответствие") Тогда
|
|
|
|
ВызватьИсключение "Ошибка преобразовани данных параметра JSON";
|
|
|
|
КонецЕсли;
|
|
|
|
|
2024-04-09 19:27:46 +02:00
|
|
|
Значение = ПолучитьЗначенияРекурсивно(JSON);
|
|
|
|
|
|
|
|
Если ЗначениеЗаполнено(Значение) Тогда
|
|
|
|
Сообщить(Значение, СтатусСообщения.Информация);
|
|
|
|
КонецЕсли;
|
2024-04-09 15:35:11 +02:00
|
|
|
|
|
|
|
КонецПроцедуры
|
|
|
|
|
|
|
|
#КонецОбласти
|
|
|
|
|
2024-04-09 19:27:46 +02:00
|
|
|
#Область СлужебныеПроцедурыИФункции
|
|
|
|
|
|
|
|
Функция ПолучитьЗначенияРекурсивно(Знач JSON, Знач Префикс = "", Знач ТекущаяВложенность = 1)
|
|
|
|
|
|
|
|
ВозвращаемоеЗначение = "";
|
2024-04-09 15:35:11 +02:00
|
|
|
|
|
|
|
Для Каждого Пара Из JSON Цикл
|
|
|
|
|
|
|
|
Значение = Пара.Значение;
|
2024-04-09 19:27:46 +02:00
|
|
|
Ключ = Префикс + Строка(Пара.Ключ);
|
2024-04-09 15:35:11 +02:00
|
|
|
|
2024-04-09 16:15:17 +02:00
|
|
|
ЭтоКоллекция = ТипЗнч(Значение) = Тип("Соответствие") Или ТипЗнч(Значение) = Тип("Структура");
|
2024-04-09 15:35:11 +02:00
|
|
|
СледующаяВложенность = ТекущаяВложенность + 1;
|
|
|
|
СледующаяВложенностьДоступна = МаксимальнаяВложенность = 0 Или СледующаяВложенность <= МаксимальнаяВложенность;
|
|
|
|
|
|
|
|
Если Не ЭтоКоллекция Или Не СледующаяВложенностьДоступна Тогда
|
2024-04-09 19:27:46 +02:00
|
|
|
ПеременнаяСреды = Ключ;
|
2024-04-09 15:35:11 +02:00
|
|
|
ПолучитьСтроку(Значение);
|
2024-04-09 19:27:46 +02:00
|
|
|
|
|
|
|
Если Не ЗначениеЗаполнено(ИскомыйПараметр) Тогда
|
|
|
|
Сообщить(ПеременнаяСреды + " = " + Значение, СтатусСообщения.Информация);
|
|
|
|
Иначе
|
|
|
|
|
|
|
|
Если ПеременнаяСреды = ИскомыйПараметр Тогда
|
|
|
|
ВозвращаемоеЗначение = Значение;
|
|
|
|
Прервать;
|
|
|
|
КонецЕсли;
|
|
|
|
|
|
|
|
КонецЕсли;
|
2024-04-09 15:35:11 +02:00
|
|
|
Иначе
|
2024-04-09 19:27:46 +02:00
|
|
|
НовыйПрефикс = Ключ + "_";
|
|
|
|
ВозвращаемоеЗначение = ПолучитьЗначенияРекурсивно(Значение, НовыйПрефикс, СледующаяВложенность);
|
|
|
|
|
|
|
|
Если ЗначениеЗаполнено(ВозвращаемоеЗначение) Тогда
|
|
|
|
Прервать;
|
|
|
|
КонецЕсли;
|
|
|
|
|
2024-04-09 15:35:11 +02:00
|
|
|
КонецЕсли;
|
|
|
|
|
|
|
|
КонецЦикла;
|
|
|
|
|
2024-04-09 19:27:46 +02:00
|
|
|
Возврат ВозвращаемоеЗначение;
|
|
|
|
|
|
|
|
КонецФункции
|
2024-04-09 15:35:11 +02:00
|
|
|
|
|
|
|
Процедура ПолучитьСтроку(Значение)
|
|
|
|
|
|
|
|
ЭтоКоллекция = ТипЗнч(Значение) = Тип("Соответствие") Или ТипЗнч(Значение) = Тип("Структура") Или ТипЗнч(Значение) = Тип("Массив");
|
|
|
|
|
|
|
|
Если ЭтоКоллекция Тогда
|
|
|
|
|
|
|
|
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows
|
|
|
|
, " "
|
|
|
|
, Истина
|
|
|
|
, Истина
|
|
|
|
, Ложь
|
|
|
|
, Ложь
|
|
|
|
, Ложь
|
|
|
|
, Ложь);
|
|
|
|
|
|
|
|
ЗаписьJSON = Новый ЗаписьJSON;
|
|
|
|
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
|
|
|
|
|
|
|
|
ЗаписатьJSON(ЗаписьJSON, Значение);
|
|
|
|
Значение = ЗаписьJSON.Закрыть();
|
|
|
|
|
|
|
|
Иначе
|
|
|
|
Значение = Строка(Значение);
|
|
|
|
КонецЕсли;
|
|
|
|
|
|
|
|
КонецПроцедуры
|
|
|
|
|
|
|
|
Процедура ПолучитьКоллекцию(Значение)
|
|
|
|
|
|
|
|
Если Значение = Неопределено Тогда
|
|
|
|
Возврат;
|
|
|
|
КонецЕсли;
|
|
|
|
|
|
|
|
ИсходноеЗначение = Значение;
|
|
|
|
|
|
|
|
Если ЭтоКоллекция(Значение) Тогда
|
|
|
|
Возврат;
|
|
|
|
Иначе
|
|
|
|
|
|
|
|
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
|
|
|
|
Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
|
|
|
|
Иначе
|
|
|
|
Значение = Строка(Значение);
|
|
|
|
КонецЕсли;
|
|
|
|
|
|
|
|
Файл = Новый Файл(Значение);
|
|
|
|
ЧтениеJSON = Новый ЧтениеJSON;
|
|
|
|
|
|
|
|
Если Файл.Существует() Тогда
|
|
|
|
|
|
|
|
ЧтениеJSON.ОткрытьФайл(Значение);
|
|
|
|
|
|
|
|
ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
|
|
|
|
|
|
|
|
ИВФ = ПолучитьИмяВременногоФайла();
|
|
|
|
КопироватьФайл(Значение, ИВФ);
|
|
|
|
ЧтениеJSON.ОткрытьФайл(ИВФ);
|
|
|
|
ЧтениеJSON.Прочитать();
|
|
|
|
|
|
|
|
УдалитьФайлы(ИВФ);
|
|
|
|
|
|
|
|
Иначе
|
|
|
|
|
|
|
|
ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение));
|
|
|
|
|
|
|
|
КонецЕсли;
|
|
|
|
|
|
|
|
Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
|
|
|
|
ЧтениеJSON.Закрыть();
|
|
|
|
|
|
|
|
КонецЕсли;
|
|
|
|
|
|
|
|
КонецПроцедуры
|
|
|
|
|
|
|
|
Процедура НормализоватьТекстовыйВвод(Знач Текст)
|
|
|
|
|
|
|
|
НачальнаяФигурная = СтрНайти(Текст, "{");
|
|
|
|
ПоследняяФигурная = СтрНайти(Текст, "}", НаправлениеПоиска.СКонца);
|
|
|
|
|
2024-04-09 15:53:50 +02:00
|
|
|
Если НачальнаяФигурная = 0 Или ПоследняяФигурная = 0 Тогда
|
2024-04-09 15:35:11 +02:00
|
|
|
Возврат;
|
|
|
|
КонецЕсли;
|
|
|
|
|
2024-04-09 15:53:50 +02:00
|
|
|
Текст = Сред(Текст, НачальнаяФигурная, ПоследняяФигурная - НачальнаяФигурная + 1);
|
2024-04-09 15:35:11 +02:00
|
|
|
|
|
|
|
КонецПроцедуры
|
|
|
|
|
|
|
|
Функция ЭтоКоллекция(Знач Значение)
|
|
|
|
|
|
|
|
Возврат ТипЗнч(Значение) = Тип("Массив")
|
|
|
|
Или ТипЗнч(Значение) = Тип("Структура")
|
|
|
|
Или ТипЗнч(Значение) = Тип("Соответствие");
|
|
|
|
|
2024-04-09 19:27:46 +02:00
|
|
|
КонецФункции
|
|
|
|
|
|
|
|
#КонецОбласти
|