Функции преобразования ЗаписьJSON

andrey5565 244 4 6 10

Функция преобразования, используемая при сериализации данных в JSON, вызывается для всех свойств, тип которых не поддерживает преобразование в формат JSON на прямую. В "функции преобразования" разработчик напрямую может проанализировать переданный объект и вернуть платформе значение которое может быть сериализовано в JSON (строка, число, дата, коллекции значений ..) либо отказаться от записи значения. Привожу пример с Объектом встроенного языка - ДанныеАдреса (подобие фикс структуры, создается на основе структуры с определенными ключами).

&НаСервере
Процедура ВыполнитьЗаписьДанныхНаСервере()
	
	ПутьНаСервере1  = "C:\Users\SystemX\Desktop\TestJSON_1.json"; 
	ПутьНаСервере2  = "C:\Users\SystemX\Desktop\TestJSON_2.json";

	МассивДанных = Новый Массив;
	
	ЗаполнитьМассивДанными(МассивДанных);
	
	СтруктураЗаписываемогоФайла = Новый Структура("Info");
	
	СтруктураЗаписываемогоФайла.Info = МассивДанных;     
	
	// 1. Новый способ (преимущественно для простых типов, быстрой генерации JSON строки); 
	//Попытка
	//	ЗначениеJSON = ЗаписатьЗначениеJSON(СтруктураЗаписываемогоФайла);	
	//Исключение
	//КонецПопытки;
	
	// 2. Старый способ;
	ЗаписьJSON = Новый ЗаписьJSON();
	
	ЗаписьJSON.ОткрытьФайл(ПутьНаСервере1, "UTF-8",, Новый ПараметрыЗаписиJSON(, " "));
	
	НастройкиСериализации = Новый НастройкиСериализацииJSON(); 
	НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
	НастройкиСериализации.СериализовыватьМассивыКакОбъекты 	= Ложь;	
	НастройкиСериализации.ФорматСериализацииДаты 			= ФорматДатыJSON.ISO;
	
	Попытка
		ЗаписатьJSON(ЗаписьJSON, СтруктураЗаписываемогоФайла, НастройкиСериализации, "ФункцияПреобразованияНеСериализуемыхТипов", ЭтотОбъект);
	Исключение
	КонецПопытки;
	
	ЗаписьJSON.Закрыть();	
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьМассивДанными(МассивДанных)
	
	Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 20
	                      |	Контрагенты.Наименование 			КАК Наименование,
	                      |	Контрагенты.НаименованиеПолное 		КАК НаименованиеПолное,
	                      |	Контрагенты.ИНН 					КАК ИНН,
	                      |	Контрагенты.КПП 					КАК КПП,
	                      |	Контрагенты.ЮрФизЛицо 				КАК ЮрФизЛицо
	                      |ИЗ
	                      |	Справочник.Контрагенты 				КАК Контрагенты		");
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Счетчик = 1;
	Пока Выборка.Следующий() 	Цикл
		                     	
		СтруктураКонтрагент = Новый Структура("Наименование, НаименованиеПолное, ИНН, КПП, ЮрФизЛицо");   
		
		ЗаполнитьЗначенияСвойств(СтруктураКонтрагент, Выборка);
		
		Если Выборка.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
			СтруктураКонтрагент.ЮрФизЛицо = "Физическое лицо";	
		ИначеЕсли Выборка.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
			СтруктураКонтрагент.ЮрФизЛицо = "Юридическое лицо";  
		Иначе
			СтруктураКонтрагент.ЮрФизЛицо = "Индивидуальный предприниматель";
		КонецЕсли; 
		
		СтруктураКонтрагент.Вставить("ТекущаяДата", ЗаписатьДатуJSON(ТекущаяДата(), ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.УниверсальнаяДата));
		
		ДопИнформация = Новый ДанныеАдреса(
										  Новый Структура
										  (
										  "Страна, Город, Дом, Индекс", 
								          "Страна - " + Счетчик, 
										  "Город  - " + Счетчик,
										  "Дом    - " + Счетчик, 
										  "Индекс - " + Счетчик
										  )
										  );
				
		СтруктураКонтрагент.Вставить("ДанныеАдреса", ДопИнформация);  
		
		МассивДанных.Добавить(СтруктураКонтрагент);    
		
		Счетчик = Счетчик + 1;
		
	КонецЦикла;

КонецПроцедуры // ЗаполнитьМассивДанными()

&НаСервере
Функция ФункцияПреобразованияНеСериализуемыхТипов(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
	
	// Вызывается для тех типов, которые платформа не может автоматические преобразовать в JSON;
	Если Свойство = "ДанныеАдреса" Тогда    
		Возврат Строка(Значение.Страна + "; " + Значение.Город + "; " + Значение.Индекс); 	
	КонецЕсли;

КонецФункции // ФункцияПреобразованиеСложныхТипов()

&НаКлиенте
Процедура ВыполнитьЗаписьДанных(Команда)
	ВыполнитьЗаписьДанныхНаСервере();
КонецПроцедуры
0
{5} Переменной ПутьНаСервере2 присвоено значение, но оно нигде не используется
{93} Не все части функции возвращают значение
Орфографическая ошибка в сериализовано: сериализовано
Орфографическая ошибка в СериализовыватьМассивыКакОбъекты: Сериализовывать
Орфографическая ошибка в ФункцияПреобразованияНеСериализуемыхТипов (найдено 2): Сериализуемых

См. также

ПреобразованиеЗначенийJSON (БСП)

Отправка почты с вложением БСП

ОбновитьЗаписьВКэшеОповещений (БСП)

УдалитьЗаписьИзКэшаОповещений (БСП)

УчетнаяЗаписьЭтойБазыПоДаннымУчетнойЗаписиКорреспондента (БСП)

Преобразование Объекта ДеревоЗначений в Объект ТаблицаЗначений

Преобразование объекта в структуру

Ключ менеджера записи регистра сведений

Функция восстановления значения при чтении JSON (ЧтениеJSON)

Модератору