Простой способ преобразовать UNICODE в строку или в структуру

Программирование - Практика программирования

Первая функция получает Строку, которая содержит строчки вида «Ключ=Значение». Вторая функция получает Структуру.

При интеграции со сторонними сервисами часто требуется перевести крокозямблы, которые приходят в ответ от REST API методов, в человеческие буквы :)

Мне эта короткая функция сильно упрощает жизнь.

Учитывайте, что функция игнорирует Значения с типами «НачалоОбъекта» и «КонецОбъекта»,  хотя мне не разу это не пригодилось.

Функция ЮникодВСтроку(ИсходнаяСтрока) Экспорт
	Ответ="";
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(ИсходнаяСтрока);
	Пока ЧтениеJSON.Прочитать() Цикл
		Если НЕ(ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.НачалоОбъекта
			ИЛИ ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.КонецОбъекта 
			ИЛИ ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.НачалоМассива
			ИЛИ ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.КонецМассива) Тогда
			
			Ответ=Ответ+?(НЕ Строка(ЧтениеJSON.ТекущееЗначение)="" 
			И ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.ИмяСвойства,Строка(ЧтениеJSON.ТекущееЗначение)+"="
			,Строка(ЧтениеJSON.ТекущееЗначение)+Символы.ВК); 
		КонецЕсли; 
	КонецЦикла;
	Возврат Ответ;
КонецФункции

Если требуется ответ в виде структуры, тогда:

Функция ЮникодВСтруктуру(ИсходнаяСтрока)Экспорт
	Ответ="";
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(ИсходнаяСтрока);
	Пока ЧтениеJSON.Прочитать() Цикл
		Если НЕ(ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.НачалоОбъекта
			ИЛИ ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.КонецОбъекта 
			ИЛИ ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.НачалоМассива
			ИЛИ ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.КонецМассива) Тогда
			
			Ответ=Ответ+?(НЕ Строка(ЧтениеJSON.ТекущееЗначение)="" 
			И ЧтениеJSON.ТипТекущегоЗначения=ТипЗначенияJSON.ИмяСвойства,Символы.ВК+ЧтениеJSON.ТекущееЗначение+"="
			,ЧтениеJSON.ТекущееЗначение); 
		КонецЕсли; 
	КонецЦикла;
	ОтветСтруктура=Новый Структура;
	Для Счетчик = 1 По СтрЧислоСтрок(Ответ) Цикл
		ТекСтрока = СтрПолучитьСтроку(Ответ, Счетчик);
		Если СокрЛП(ТекСтрока)<>"" Тогда
			Ключ=Лев(ТекСтрока,СтрНайти(ТекСтрока,"=")-1);
			Значение=СтрЗаменить(ТекСтрока,Ключ+"=","");
			Если Ключ<>Значение Тогда
				ОтветСтруктура.Вставить(Ключ,Значение);
			Иначе
				ОтветСтруктура.Вставить(Ключ,"");
			КонецЕсли; 
		КонецЕсли; 
	КонецЦикла;
	Возврат ОтветСтруктура;
КонецФункции

См. также

Комментарии
1. Альтаир (Altair777) 637 11.07.17 10:08 Сейчас в теме
(0) а какой смысл в строках
Ответ=Ответ;
?
2. Дмитрий Деулин (dimasts) 22 11.07.17 11:38 Сейчас в теме
(1)Согласен – это артефакт от какой-то предидущей логики. Видимо оставил для понятности. Переписал.
3. Никита Грызлов (nixel) 135 12.07.17 09:18 Сейчас в теме
А обратное преобразование есть под рукой?
4. Дмитрий Деулин (dimasts) 22 12.07.17 12:53 Сейчас в теме
(3) Под рукой нет. Но там не сложно должно быть. Так же создаёшь чтение и в цикле записываешь НачалоОбъекта ТипЗначения Значение НачалоМассива КонецМассива и КонецОбъекта.
5. Никита Грызлов (nixel) 135 12.07.17 16:13 Сейчас в теме
(4) для обычного преобразования строки накидал такую процедурку:

Функция СтрокаВЮникод(Вход)
	ЗаписьJSON = Новый ЗаписьJSON;
	ИспользоватьДвойныеКавычки = Ложь;
	ЭкранироватьОдинарныеКавычки = Ложь;
	ЭкранироватьСлэш = Ложь;
	ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(
		,
		,
		ИспользоватьДвойныеКавычки,
		ЭкранированиеСимволовJSON.NotASCIISymbols,
		,
		,
		,
		ЭкранироватьОдинарныеКавычки,
		ЭкранироватьСлэш 
	);
	ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
	ЗаписьJSON.ЗаписатьЗначение(Вход);
	Выход = ЗаписьJSON.Закрыть();

        // Раскомментировать, если используется в OneScript - в 1.0.16 он добавляет одинарные кавычки вокруг строки.
	//Выход = Сред(Выход, 2, СтрДлина(Выход) - 2);
	Возврат Выход;
КонецФункции
...Показать Скрыть
Оставьте свое сообщение