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