Функция глРегСтрЗаменить(Знач Стр, Знач Регулярка, Знач СтрПодставить) Экспорт Далее Функция глРазборJSON(Знач Стр) Экспорт Далее Функция глРазобратьМассив(Стр) Далее //******************************************* Функция глОтобразитьСписокЗначений(РезультатРазбора, Отступ=1, Таб="", Заголовок="") Экспорт Если ((ТипЗначения(Таб)=0) или (Таб="")) Тогда Таб=СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("ТабСписокЗначений"); КонецЕсли; Если ПустоеЗначение(Заголовок)=0 Тогда Таб.ВывестиСекцию("Заголовок|Строка"); КонецЕсли; Для н=1 По РезультатРазбора.РазмерСписка() Цикл Ключ=""; Значение=РезультатРазбора.ПолучитьЗначение(н, Ключ); Для м=1 По Отступ Цикл Если м=1 Тогда Таб.ВывестиСекцию("Отступ|Строка"); Иначе Таб.ПрисоединитьСекцию("Отступ|Строка"); КонецЕсли; КонецЦикла; Таб.ПрисоединитьСекцию("Вывод|Строка"); Если ТипЗначенияСтр(Значение)="СписокЗначений" Тогда глОтобразитьСписокЗначений(Значение, Отступ+1, Таб); КонецЕсли; КонецЦикла; Возврат Таб; КонецФункции //******************************************* Функция глПоказатьJSON(Знач ТекстОтвета, Таб="", Заголовок="") Экспорт Если ((ТипЗначения(Таб)=0) или (Таб="")) Тогда Таб=СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("ТабСписокЗначений"); КонецЕсли; РезультатРазбора=глРазборJSON(ТекстОтвета); глОтобразитьСписокЗначений(РезультатРазбора, 0, Таб, Заголовок); Таб.Опции(0); Таб.Показать(); ТТ=СоздатьОбъект("Текст"); ТТ.ДобавитьСтроку(ТекстОтвета); Сообщить(КаталогИБ()+"_otvet.txt"); ТТ.Записать(КаталогИБ()+"_otvet.txt"); КонецФункции //********************************************************************************* Функция УбратьВедущиеСкобки(Стр, Открывашки="{[", Закрывашки="}]") Если Найти(Открывашки, Лев(Стр, 1)) > 0 Тогда Стр=Сред(Стр, 2); КонецЕсли; Если Найти(Закрывашки, Прав(Стр, 1)) > 0 Тогда Стр=Лев(Стр, СтрДлина(Стр)-1); КонецЕсли; Возврат Стр КонецФункции //********************************************************************************* Функция ПроверитьСимвол(Символ, СчётчикОткрывашек) Если Найти("{[", Символ)>0 Тогда СчётчикОткрывашек=СчётчикОткрывашек+1; КонецЕсли; Если Найти("]}", Символ)>0 Тогда СчётчикОткрывашек=СчётчикОткрывашек-1; КонецЕсли; КонецФункции //********************************************************************************* Функция глРазобратьМассив(Стр) Экспорт НачалоПары=1; СчётчикЭлементов=0; СчётчикОткрывашек=0; СчётчикОдинарныхКавычек=0; СчётчикДвойныхКавычек=0; Стр=СокрЛП(Стр); Стр=глУбратьВедущиеСкобки(Стр); СтрСтрДлина=СтрДлина(Стр); Результат=СоздатьОбъект("СписокЗначений"); Для Поз=1 По СтрДлина(Стр) Цикл Символ=Сред(Стр, Поз, 1); Если Найти("'",Символ)>0 Тогда СчётчикОдинарныхКавычек=СчётчикОдинарныхКавычек+1; КонецЕсли; Если Найти("""",Символ)>0 Тогда СчётчикДвойныхКавычек=СчётчикДвойныхКавычек+1; КонецЕсли; ПроверитьСимвол(Символ, СчётчикОткрывашек); Если (((Сред(Стр, Поз, 1)=",") и (СчётчикОткрывашек=0) и (СчётчикДвойныхКавычек%2=0) и (СчётчикОдинарныхКавычек%2=0)) или (Поз=СтрСтрДлина)) Тогда СчётчикЭлементов=СчётчикЭлементов+1; Элемент=СокрЛП(Сред(Стр, НачалоПары, Поз-НачалоПары+?(Поз=СтрСтрДлина,1,0))); НачалоПары=Поз+1; Если Лев(Элемент, 1)="[" Тогда //Разобрать строку как массив Элемент=глРазобратьМассив(Элемент); ИначеЕсли Лев(Элемент, 1)="{" Тогда //Разобрать строку как JSON Элемент=глРазборJSON(Строка(Элемент)); КонецЕсли; Результат.ДобавитьЗначение(Элемент, Строка(СчётчикЭлементов)); КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции //********************************************************************************* Функция глЭтоJSON(Стр) Экспорт ///Когда-нибудь здесь обязательно будет валидатор JSON, использование которого быстрее, чем парсинг JSON Стр=СокрЛП(Стр); Если ((лев(Стр, 1)="{") и (прав(Стр, 1)="}")) Тогда Возврат 1; Иначе Возврат 0; КонецЕсли КонецФункции //********************************************************************************* Функция глРазборJSON(Знач Стр) Экспорт //На входе строка в текущей системной кодировке Результат=СоздатьОбъект("СписокЗначений"); Стр = СокрЛП(Стр); Стр = глРегСтрЗаменить(Стр, "\s?(\{|\}|:|,){1}\s?", "$1"); //, "Да"); Стр = глРегСтрЗаменить(Стр, "\s{2,}", ""); Стр=глУбратьВедущиеСкобки(Стр); СтрСтрДлина=СтрДлина(Стр); НачалоПары=1; СчётчикОткрывашек=0; СчётчикОдинарныхКавычек=0; СчётчикДвойныхКавычек=0; Для Поз=1 по СтрСтрДлина Цикл Символ=Сред(Стр, Поз, 1); Если Найти("'",Символ)>0 Тогда СчётчикОдинарныхКавычек=СчётчикОдинарныхКавычек+1; КонецЕсли; Если Найти("""",Символ)>0 Тогда СчётчикДвойныхКавычек=СчётчикДвойныхКавычек+1; КонецЕсли; ПроверитьСимвол(Символ, СчётчикОткрывашек); Если (((Сред(Стр, Поз, 1)=",") и (СчётчикОткрывашек=0) и (СчётчикДвойныхКавычек%2=0) и (СчётчикОдинарныхКавычек%2=0)) или (Поз=СтрСтрДлина)) Тогда Пара=Сред(Стр, НачалоПары, Поз-НачалоПары+?(Поз=СтрСтрДлина,1,0)); Ключ=глТокен(Пара, 1, ":"); Значение=Сред(Пара, СтрДлина(Ключ)+2); Если Лев(Значение, 1)="[" Тогда Значение=глРазобратьМассив(Значение); ИначеЕсли Лев(Значение, 1)="{" Тогда Значение=глРазборJSON(Строка(Значение)); КонецЕсли; Ключ=глУбратьВедущиеСкобки(Ключ, """", """"); Значение=глУбратьВедущиеСкобки(Значение, """", """"); Результат.ДобавитьЗначение(Значение, Ключ); НачалоПары=Поз+1; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции //глРазборJSON(Знач Стр) //********************************************************************************* //Замена вхождений подстроки Функция глРегСтрЗаменить(Знач Стр, Знач Регулярка, Знач СтрПодставить) Экспорт RegExp = СоздатьОбъект("VBScript.RegExp"); RegExp.IgnoreCase = Ложь; //Не игнорировать регистр RegExp.Global = Истина; //Поиск всех вхождений шаблона RegExp.MultiLine = Ложь; //Многострочный режим RegExp.Pattern = Регулярка; Шаблон1="#$##$#"; Стр=RegExp.Replace(Стр, Шаблон1); Стр=СтрЗаменить(Стр, Шаблон1, СтрПодставить); //Сообщить("Стр стало: """+Стр+""""); Возврат Стр; //Выдаст в окно сообщений: //"Дятел продолбил сосну" КонецФункции //глРегСтрЗаменить(Знач Стр, Знач Регулярка, Знач СтрПодставить) Экспорт