Реализовано в версии 8.3.7.1759.
Некоторое время назад мы рассказывали о том, что в платформе реализованы средства работы с JSON. Потоковая запись/чтение и сериализация примитивных типов и коллекций.
Теперь мы рады рассказать вам о том, что мы полностью автоматизировали работу с JSON и реализовали в платформе третью группу средств. Они позволяют сериализовать в JSON прикладные типы 1С:Предприятия: ссылки, объекты, наборы записей и вообще любые типы, для которых поддерживается XDTO сериализация. Конечно же, мы обеспечили и обратную операцию - десериализацию.
Прежде всего, и в основном, XDTO сериализацию в JSON мы рекомендуем использовать при обмене данными между двумя прикладными решениями 1С:Предприятия. По сравнению с XML формат JSON более компактный, сериализация/десериализация в/из JSON выполняется быстрее. Кроме этого мы предприняли дополнительные меры для того, чтобы сократить объём передаваемых данных.
Кроме обмена между приложениями 1С:Предприятия этот механизм можно использовать и для обмена с внешними системами, готовыми принимать типы данных 1С:Предприятия. Например, XDTO сериализацию в JSON можно использовать для организации собственного HTTP интерфейса прикладного решения. Сервис на платформе 1С:Предприятия будет формировать ответ в памяти в виде строки JSON. А затем передавать её при помощи объекта HTTPСервисОтвет. Реализованный нами механизм сериализации полностью соответствует стандарту JSON. Поэтому внешняя система не должна испытывать каких-либо трудностей с десериализацией.
Использование XDTO сериализации в JSON для других задач видится нам маловероятным. Потому что если внешняя система не готова работать с прикладными типами 1С:Предприятия, то зачем их ей передавать? А если предполагается обмениваться только примитивными типами и коллекциями, то для этой задачи хорошо подходят методы ПрочитатьJSON() и ЗаписатьJSON(), о которых мы рассказывали ранее.
Простейший код, выполняющий сериализацию элемента справочника, может выглядеть так:
В результате будет получен файл JSON следующего содержания:
{
"#type": "jcfg:CatalogObject.Контрагенты",
"#value": {
"IsFolder": false,
"Ref": "3d710076-8d04-11dc-8ca0-000d8843cd1b",
"DeletionMark": false,
"Parent": "9d5c422c-8c4c-11db-a9b0-00055d49b45e",
"Code": "000000012",
"Description": "Мосхлеб ОАО",
"Регион": "9d5c422f-8c4c-11db-a9b0-00055d49b45e",
"Индекс": "456789",
"Страна": "Россия",
"Город": "Москва",
"Улица": "Петровка",
"Дом": "12",
"Телефон": "+7(999)234-78-64",
"ЭлектроннаяПочта": "mh@hleb.ru",
"Факс": "",
"ВебСайт": "",
"ВидЦен": "9d5c4225-8c4c-11db-a9b0-00055d49b45e",
"ДополнительнаяИнформация": "Поставка хлеба",
"КонтактноеЛицо": "Громышева П.Р.",
"Широта": 55.762744,
"Долгота": 37.618102
}
}
Десериализацию такого файла можно выполнить следующим кодом:
В результате будет получен элемент справочника Контрагенты с наименованием Мосхлеб ОАО и кодом 000000012.
Как вы уже могли заметить, сериализация/десериализация выполняется с помощью объекта СериализаторXDTO. Поэтому получаемая структура документа имеет «родовые черты» XML, JSON получается «похожим» на XML. Это оказывает отрицательное влияние и на «читаемость» и на компактность файла. Это своеобразная «плата» за удобства, получаемые от использования XDTO. Если же «чистота» получаемого JSON имеет для вас решающее значение, мы рекомендуем использовать инструменты, о которых мы рассказывали ранее.
Общие принципы сериализации в JSON идентичны XDTO сериализации в XML. В частности:
Кроме этого есть одна важная особенность. В отличие от XML, для записи начала объекта JSON нет необходимости указывать его имя. По этой причине сериализация/десериализация JSON может выполняться одним из двух способов.
Либо при сериализации вы указываете явное назначение типа и потом десериализуете без указания типа считываемого значения:
Либо вы сериализуете в JSON без явного назначения типа. Но тогда тип нужно будет указать при десериализации:
Ещё одна особенность сериализации заключается в том, что мы стремились оптимизировать объём результирующего файла. Поэтому для встроенных типов платформы пространства имен не записываются полностью в отдельном свойстве JSON, а указываются в виде префикса перед типом:
В данном случае префикс jcfg обозначает пространство имён http://v8.1c.ru/8.1/data/enterprise/current-config. Соответствие префиксов пространствам имён «зашито» в платформу. Поэтому каких-либо трудностей с определениями типов при обмене между приложениями 1С:Предприятия не возникает.
А при обмене с внешними системами, для правильной десериализации типов платформы, внешней системе понадобится полная таблица соответствия. Такая таблица есть, и она опубликована в документации.
Общие принципы десериализации также связаны с использованием механизма XDTO. В частности:
При десериализации у вас есть возможность изменить получаемые данные. Для этого, как и в случае с примитивными типами и коллекциями, вы можете использовать функцию восстановления.
Эта возможность может потребоваться, например, для того, чтобы при переносе данных из одного прикладного решения в другое, заменить в них ссылки на связанные объекты. Так, чтобы после переноса эти данные ссылались уже на объекты новой базы. Или, например, для того, чтобы удалить из данных информацию, имеющую смысл только в исходной базе.
Допустим, в исходной базе описание товара хранится в HTML виде. А в вашей базе достаточно текстового описания, или такое описание вообще не нужно. Потому что у вас будет собственное описание.
Тогда, имея файл следующего содержания:
{
"#type": "jcfg:CatalogObject.Товары",
"#value": {
"IsFolder": false,
"Ref": "2d97a749-8ea9-11dc-8ca1-000d8843cd1b",
"DeletionMark": false,
"Parent": "87f1c226-9679-11db-a9b2-00055d49b45e",
"Code": "000000030",
"Description": "Колбаса",
"Артикул": "Kol67",
"Поставщик": "95f19911-d7c6-11db-a9bd-00055d49b45e",
"ФайлКартинки": "00000000-0000-0000-0000-000000000000",
"Вид": "Товар",
"Штрихкод": "",
"Описание":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
<html>
<head>
<meta name=\"viewport\" content=\"initial-scale=1.0, width=device-width\"></meta>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></meta>
<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE7\"></meta>
<meta name=\"format-detection\" content=\"telephone=no\"></meta>
<style type=\"text/css\">\n
body{margin:0px;padding:8px;overflow:auto;width:100%;height:100%;}\n
p{line-height:1.15;margin:0px;}\n
ol,ul{margin-top:0px;margin-bottom:0px;}\n
img{border: none;}\n
</style>
</head>
<body>\n
<p>Колбаса \"Докторская\" вареная высшего сорта из охлажденного мяса</p>\n
<p><span style=\" font-weight: bold;\">Вес - </span> 500 г.</p>\n
</body>
</html>"
}
}
вы можете при десериализации использовать собственную функцию восстановления, в которой очистить свойство Описание:
В результате этого кода будет прочитан объект СправочникОбъект.Товары, у которого реквизит Описание будет содержать пустую строку: