Функция преобразования, которая используется при сериализации данных в JSON, будет вызываться для всех свойств, тип которых не поддерживает преобразование в формат JSON напрямую. В этой функции разработчик может самостоятельно проанализировать переданный объект и вернуть платформе значение, которое может быть сериализовано в JSON, либо вообще отказаться от его записи.
Например, структура с информацией о контрагенте помимо примитивных типов данных содержит объект встроенного языка ДанныеАдреса. JSON ничего не знает о подобных типах, поэтому если попытаться записать данные в JSON обычным образом, без использования функции преобразования, то будет получена ошибка из-за недопустимых для сериализации типов данных. Поэтому в метод ЗаписатьJSON() мы передаем имя функции преобразования и указываем, что она находится в том же модуле формы (ЭтотОбъект), что и процедура сериализации данных (листинг 1.24).
Листинг 1.24. Пример сериализации в JSON-документ с использованием функции преобразования
&НаСервере
Процедура СериализацияСФункциейПреобразованияНаСервере()
// Создать структуру с данными контрагента.
Данные = Новый Структура;
Данные.Вставить("Контрагент", "ОАО Топаз");
Данные.Вставить("ОбъемПродаж", 5000000);
// Записать свойство Адрес, имеющее тип ДанныеАдреса.
ДопИнфо = Новый ДанныеАдреса(Новый Структура("Город, Страна, Индекс", "Москва", "Россия", "112233"));
Данные.Вставить("Адрес", ДопИнфо);
Данные.Вставить("Поставщик", Ложь);
// Создать объект записи и открыть файл, в который будет выполняться запись.
Запись = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
Запись.ОткрытьФайл("c:\temp\Serialisation_4.json",,, ПараметрыЗаписиJSON);
// Выполнить запись данных (Данные) с помощью объекта записи (Запись).
ЗаписатьJSON(Запись, Данные, , "ФункцияПреобразованияЗаписи", ЭтотОбъект);
// Завершить работу с файлом.
Запись.Закрыть();
КонецПроцедуры
Отличие от обычной записи данных в JSON-документ заключается в том, что для всех свойств, тип которых не поддерживает автоматическую сериализацию в JSON, вызывается функция преобразования ФункцияПреобразованияЗаписи().
В этой функции в параметрах Свойство и Значение содержатся соответственно имя и значение того поля структуры данных, которое не может быть автоматически сериализовано в JSON (листинг 1.25).
Листинг 1.25. Функция преобразования
&НаСервере
Функция ФункцияПреобразованияЗаписи(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
Если Свойство = "Адрес" Тогда
Адрес = "Страна: " + Значение.Страна + ", Индекс: " + Значение.Индекс + ", Город: " + Значение.Город;
Возврат Адрес;
КонецЕсли;
Отказ = Истина;
КонецФункции
В функции преобразования мы извлекаем данные из объекта ДанныеАдреса в строку, и эта строка возвращается в метод ЗаписатьJSON().
В результате сформированный JSON-документ будет иметь следующий вид (листинг 1.26).
Листинг 1.26. Содержимое JSON-документа
{
"Контрагент": "ОАО Топаз",
"ОбъемПродаж": 5000000,
"Адрес": "Страна: Россия, Индекс: 112233, Город: Москва",
"Поставщик": false
}