Как преобразовать любой текст json в объект 1с (массив / структуру) 4

Часто на практике программисты 1с сталкиваются с необходимость обработки данных полученных из другой учетной системы (например с сайта) в формате json. Появляется задача преобразования json в 1с.

К сожалению типовой функционал 1с не позволяет получить json в удобном формате для дальнейшей его обработки.

Вот пример кода, который позволит быстро преобразовать любой текст json в 1с (массив / структуру) и далее им оперировать в коде.

*Просьба обратить внимание на преобразование даты или других типов.  Дело в том,  что не всегда типовая функция чтения json Прочитать() возвращает данные/значения, с указанием их типов.

Частный случай: скорее всего вам необходимо будет внести правки на определение даты по имени свойства (в нашем случае мы ищем в имени свойства строку “date”: Найти(нрег(ИмяСвойства), “date”)>0) .

А так же описать преобразование даты (другого типа) в значение правильного типа. Если это не выполнить, тогда в значение будет помещено значение типа строка.

Параметры:

_Строка -двоичные данные 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)");
				Иначе	
					Выполнить("ТекущийСериалОбъектJSON.Вставить("+СимволКавычки+ИмяСвойства+СимволКавычки+", Новый "+ТипОбъекта+")"); //добавляем новую структуру / массив
					ТекущийСериалОбъектJSON = Вычислить("ТекущийСериалОбъектJSON."+ИмяСвойства);
				КонецЕсли;
			КонецЕсли;
			
			спОткрытыеОбъекты.Добавить(Новый Структура("ТекущийСериалОбъектJSON", ТекущийСериалОбъектJSON));
			
		ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения  = ТипЗначенияJSON.КонецОбъекта или ЧтениеJSON.ТипТекущегоЗначения  = ТипЗначенияJSON.КонецМассива Тогда
		
			спОткрытыеОбъекты.Удалить(спОткрытыеОбъекты.Получить(спОткрытыеОбъекты.Количество()-1));
			
			Попытка
				ТекущийСериалОбъектJSON = спОткрытыеОбъекты.Получить(спОткрытыеОбъекты.Количество()-1).Значение.ТекущийСериалОбъектJSON;
			Исключение
				//дошли до конца
			КонецПопытки;
			
		ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения  = ТипЗначенияJSON.ИмяСвойства Тогда
			ИмяСвойства  = ЧтениеJSON.ТекущееЗначение;
			
			
		ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения  = ТипЗначенияJSON.Null или ЧтениеJSON.ТипТекущегоЗначения  = ТипЗначенияJSON.Булево
			ИЛИ ЧтениеJSON.ТипТекущегоЗначения  = ТипЗначенияJSON.Строка или ЧтениеJSON.ТипТекущегоЗначения  = ТипЗначенияJSON.Число Тогда
			
			    ТекущееЗначение = ЧтениеJSON.ТекущееЗначение;
					
				Если Найти(нрег(ИмяСвойства), "date")>0 Тогда
					Если ЧтениеJSON.ТекущееЗначение="" Тогда
						ТекущееЗначение = Дата(1,1,1);	
					Иначе	
						Попытка
							ТекущееЗначение = Дата(Лев(ТекущееЗначение,4), Сред(ТекущееЗначение,6,2), Сред(ТекущееЗначение,9,2), Сред(ТекущееЗначение,12,2),Сред(ТекущееЗначение,15,2),0);
						Исключение
							//прописать преобразования в дату в ненайденном формате
						КонецПопытки;
					КонецЕсли;
				КонецЕсли;
				
				Если ТипЗнч(ТекущийСериалОбъектJSON) = Тип("Массив") Тогда
					ТекущийСериалОбъектJSON.добавить(ТекущееЗначение);
				ИначеЕсли ИмяСвойства<>"" Тогда
					ТекущийСериалОбъектJSON.Вставить(ИмяСвойства, ТекущееЗначение);
				КонецЕсли;
			
		Иначе
			ИмяТекущегоЗначения = "";
		КонецЕсли;
	КонецЦикла;
	
	Исключение
	    Сообщить(""+ОписаниеОшибки()+Символы.пс+"Строка json не преобразована: "+_Представление);
		Возврат Новый Массив();
		
	КонецПопытки;
	
	Возврат СериалОБъектJSON
КонецФункции

Комментария

  1. Спасибо огромное!

    1. Была рада помочь вам)

      Юлия Моисеева
  2. ПрочитатьJSON – стандартная функция 1с

    1. Данная процедура писалась тогда, когда еще не было стандартной функции. Да и сейчас еще люди используют платформы, где ее нет.

      Александр

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *