JSON-сериализация «эмулирует» XML-сериализацию, в силу чего получающийся JSON-документ внешне выглядит очень похоже на соответствующий XML-документ. В JSON-документ могут быть помещены любые объекты системы «1С:Предприятие», для которых указано, что они могут быть сериализованы в XDTO.
Общие принципы сериализации в JSON идентичны XDTO-сериализации в XML. В частности:
Сериализация прикладных типов в JSON-документ происходит с помощью метода ЗаписатьJSON() объекта глобального контекста СериализаторXDTO.
При этом существует одна важная особенность. В отличие от XML для записи начала объекта JSON нет необходимости указывать его имя. Поэтому сериализация/десериализация в/из JSON может выполняться одним из двух способов.
Во-первых, при сериализации в параметре НазначениеТипаXML метода ЗаписатьJSON() можно указать явное назначение типа (НазначениеТипаXML.Явное). Десериализовать такой объект можно без указания типа считываемого значения (листинг 1.45).
Листинг 1.45. Пример сериализации элемента справочника в JSON-документ с указанием типа
&НаСервереБезКонтекста
Процедура СериализацияПрикладныхТиповНаСервере()
// Получить записываемый объект.
СсылкаНаОбъект = Справочники.Сотрудники.НайтиПоКоду("000000003");
Объект = СсылкаНаОбъект.ПолучитьОбъект();
// Создать объект записи и открыть файл, в который будет выполняться запись.
Запись = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
Запись.ОткрытьФайл("c:\temp\SerialisationXDTO.json",,, ПараметрыЗаписиJSON);
// Выполнить запись данных (Объект) с помощью объекта записи (Запись).
СериализаторXDTO.ЗаписатьJSON(Запись, Объект, НазначениеТипаXML.Явное);
// Завершить работу с файлом.
Запись.Закрыть();
КонецПроцедуры
В процедуре записи ссылка на объект справочника Сотрудники находится по коду, а затем данные объекта записываются в JSON-документ с указанием его типа.
В результате сформированный JSON-документ будет иметь следующий вид (листинг 1.46).
Листинг 1.46. Содержимое JSON-документа
{
"#type": "jcfg:CatalogObject.Сотрудники",
"#value": {
"Ref": "0b6cd7dc-36a0-11e9-8bb2-642737df2048",
"DeletionMark": false,
"Code": "000000003",
"Description": "Артемов Игорь Владимирович",
"ДатаРождения": "1970-01-31T00:00:00",
"КоличествоДетей": 2,
"Работает": true,
"Стаж": "25.03.20"
}
}
Из соображений компактности сформированного JSON-документа для встроенных типов платформы пространства имен не записываются полностью в отдельном свойстве JSON, а указываются в виде префикса перед типом, например jcfg (см. листинг 1.46).
В данном случае префикс cfg обозначает пространство имен http://v8.1c.ru/8.1/data/enterprise/current-config. Соответствие префиксов пространствам имен «зашито» в платформу. Поэтому обмен данными между прикладными решениями «1С:Предприятия» выполняется стандартным образом. А при обмене с внешними системами для правильной десериализации типов платформы внешней системе понадобится полная таблица соответствия, приведенная в документации.
Во-вторых, можно выполнить сериализацию в JSON без явного назначения типа (листинг 1.47). Но тогда тип нужно будет указать при десериализации (см. листинг 1.50).
Листинг 1.47. Пример сериализации элемента справочника в JSON-документ без указания типа
&НаСервереБезКонтекста
Процедура СериализацияПрикладныхТиповНаСервере()
// Получить записываемый объект.
СсылкаНаОбъект = Справочники.Сотрудники.НайтиПоКоду("000000002");
Объект = СсылкаНаОбъект.ПолучитьОбъект();
// Создать объект записи и открыть файл, в который будет выполняться запись.
Запись = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
Запись.ОткрытьФайл("c:\temp\SerialisationXDTO_2.json",,, ПараметрыЗаписиJSON);
// Выполнить запись данных (Объект) с помощью объекта записи (Запись).
СериализаторXDTO.ЗаписатьJSON(Запись, Объект);
// Завершить работу с файлом.
Запись.Закрыть();
КонецПроцедуры
В результате сформированный JSON-документ будет иметь следующий вид (листинг 1.48).
Листинг 1.48. Содержимое JSON-документа
{
"#value": {
"Ref": "0b6cd7db-36a0-11e9-8bb2-642737df2048",
"DeletionMark": false,
"Code": "000000002",
"Description": "Смирнова Светлана Ивановна",
"ДатаРождения": "1990-02-22T00:00:00",
"КоличествоДетей": 0,
"Работает": false,
"Стаж": "03.10.27"
}
}
Кроме того, нужно учитывать, что сериализация значений типа Дата выполняется в формате ISO. Это определяется механизмом XDTO и не управляется при записи данных. Также при операции сериализации не поддерживается использование функции преобразования, в отличие от потоковой и объектной техник.