В своей предыдущей статье «Гайд по XDTO для чайников» я подробно описал основные моменты работы с данным механизмом, однако не затронул тему использования JSON в XDTO, по поводу чего получил заслуженную критику в комментариях. Исправляюсь, и целиком посвящаю статью устранению данного пробела.
Введение в JSON и XDTO: сравнение с XML
JSON (JavaScript Object Notation) — это формат обмена данными, который стал стандартом де-факто для современных веб-сервисов. Он компактный, удобочитаемый и нативно поддерживается большинством языков программирования, включая 1С.
XDTO (XML Data Transfer Objects) — это механизм 1С, созданный для работы с XML. Он позволяет формировать объекты, строго соответствующие XML-схемам (XSD), и автоматически сериализовать их в XML.
Несмотря на то, что XDTO ориентирован на XML, начиная с версии 8.3.7, 1С получила поддержку JSON-сериализации XDTO, что значительно упростило интеграцию с сервисами, работающими на JSON. Теперь можно использовать XDTO не только для XML, но и для JSON, при этом сохраняя строгую типизацию и преимущества XDTO.
Формат |
Преимущества |
Недостатки |
XML |
Строгая схема, удобство в XDTO, поддержка в 1С |
Избыточность, сложность парсинга |
JSON |
Компактность, популярность, удобочитаемость |
Нет встроенной строгой схемы, нюансы работы с типами |
Таким образом, JSON становится хорошей альтернативой XML, особенно для веб-сервисов и интеграции с REST API.
Почему JSON набирает популярность в 1С
Старые SOAP-сервисы, использующие XML, постепенно уступают место REST API, работающим с JSON. Причины этого:
- Меньший объём данных. JSON-код короче XML за счёт отсутствия закрывающих тегов.
- Лёгкость обработки. JSON проще читать и парсить, особенно на стороне браузеров.
- Широкая совместимость. Практически все современные API используют JSON.
- Поддержка в 1С. Начиная с 8.3.7, XDTO умеет работать не только с XML, но и с JSON.
Если раньше разработчикам приходилось вручную преобразовывать JSON в XML и обратно, то теперь можно работать с JSON напрямую через XDTO. Это упрощает интеграцию и снижает вероятность ошибок.
Основные возможности XDTO для работы с JSON
Теперь XDTO поддерживает JSON-сериализацию и десериализацию без необходимости промежуточного преобразования в XML. Ключевые возможности:
- Автоматическое преобразование XDTO-объектов в JSON.
- Сохранение структуры данных в JSON.
- Поддержка коллекций (массивов) в JSON.
- Гибкая настройка сериализации (например, добавление информации о типах).
- Чтение JSON-объектов и восстановление XDTO-структуры.
Таким образом, XDTO в 1С теперь можно использовать для удобной работы с JSON, сохраняя преимущества строгой структуры данных и автоматической сериализации.
Сериализация XDTO в JSON
Общие принципы JSON-сериализации XDTO
JSON-сериализация XDTO в 1С позволяет представлять объекты XDTO в виде JSON-структур, что делает возможной интеграцию с REST API и другими сервисами, работающими с JSON.
Основные принципы работы с JSON в XDTO:
- JSON-сериализация сохраняет структуру объекта XDTO.
- Коллекции XDTO преобразуются в массивы JSON.
- Типы данных могут быть сохранены или опущены в зависимости от настроек.
- Пространства имён XML не сохраняются в JSON.
Использование СериализаторXDTO.ЗаписатьJSON()
Для сериализации XDTO-объекта в JSON используется метод ЗаписатьJSON(). Этот метод записывает объект в поток JSON, сохраняя его структуру.
Пример:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектXDTO);
JSONСтрока = ЗаписьJSON.Закрыть();
Сообщить(JSONСтрока);
Этот код преобразует объект XDTO в JSON-строку и выводит её в интерфейс 1С.
Управление типами данных при сериализации (НазначениеТипаXML.Явное)
По умолчанию JSON-сериализация XDTO не добавляет информацию о типах данных. Это может привести к проблемам при десериализации. Чтобы включить явное указание типов, используется третий параметр НазначениеТипаXML.Явное.
Пример:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектXDTO, НазначениеТипаXML.Явное);
JSONСтрока = ЗаписьJSON.Закрыть();
Сообщить(JSONСтрока);
В этом случае JSON будет включать информацию о типах, что облегчит последующую десериализацию.
Например, элемент справочника Валюты будет преобразован в строку JSON примерно такого вида:
{
"#type": "jcfg:CatalogObject.Валюты",
"#value": {
"Ref": "5b65bd8e-ea70-11e4-af93-e03f49b16069",
"DeletionMark": false,
"Code": "978",
"Description": "Евро",
"Курс": 54.659,
"ДатаКурса": "2015-04-25T00:00:00"
}
}
Как мы видим, появился элемент #type, который и описывает тип текущего элемента.
Особенности работы с коллекциями и пространствами имён
- Коллекции XDTO в JSON представлены в виде массивов
- {
- "Сотрудники": [
- { "ФИО": "Иван Иванов" },
- { "ФИО": "Пётр Петров" }
- ]
- }
В отличие от XML, где коллекции хранятся в виде повторяющихся узлов, JSON использует массивы.
- Пространства имён XML в JSON не сохраняются. Если объект XDTO содержит пространство имён, оно не будет включено в JSON-представление.
Теперь вы знаете, как сериализовать XDTO в JSON, управлять типами данных и работать с коллекциями. Далее мы рассмотрим процесс обратной десериализации JSON в XDTO.
Десериализация JSON в XDTO
Чтение JSON в объекты XDTO (СериализаторXDTO.ПрочитатьJSON())
Десериализация — это процесс преобразования JSON-данных обратно в объект XDTO. В 1С для этого используется метод СериализаторXDTO.ПрочитатьJSON().
Пример:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку('{ "ФИО": "Иван Иванов", "Возраст": 30 }');
ОбъектXDTO = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON, Тип("СправочникОбъект.Сотрудники"));
Сообщить(ОбъектXDTO.ФИО);
Этот код преобразует JSON-строку в объект XDTO, используя указанный тип данных.
Работа с JSON без явного указания типов
Если JSON-данные не содержат информацию о типах, их десериализация может потребовать дополнительной обработки. В этом случае можно использовать стандартный парсер JSON и вручную преобразовывать данные в XDTO.
Пример:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку('{ "ФИО": "Пётр Петров", "Возраст": 40 }');
Данные = ЧтениеJSON.Прочитать();
ТипXDTO = ФабрикаXDTO.Тип("http://example.com/employees", "Сотрудник");
ОбъектXDTO = ФабрикаXDTO.Создать(ТипXDTO);
ОбъектXDTO.ФИО = Данные.ФИО;
ОбъектXDTO.Возраст = Данные.Возраст;
В этом примере JSON сначала читается как обычная структура 1С, а затем значения вручную переносятся в объект XDTO.
Использование функций восстановления при чтении
Функции восстановления позволяют подставлять значения по умолчанию или корректировать данные при десериализации, если в JSON-объекте отсутствуют или искажены некоторые поля.
Пример функции восстановления:
&НаСервере
Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
Если Свойство = "pressure" Тогда
Возврат Значение*0.75;
ИначеЕсли Свойство = "temp" Тогда
Возврат Значение-273.15;
ИначеЕсли Свойство = "speed" Тогда
Возврат Значение*1.61;
Иначе
Возврат Значение;
КонецЕсли;
КонецФункции
Чтобы использовать эту функцию при чтении JSON, её необходимо передать в метод ПрочитатьJSON.
Пример чтения JSON с функцией восстановления:
&НаСервере
Процедура ЧтениеНаСервере()
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("c:\temp\weather.json");
Данные = ПрочитатьJSON(Чтение, Ложь, , , "ФункцияВосстановленияЧтения", ЭтотОбъект);
Чтение.Закрыть();
КонецПроцедуры
Использование функций восстановления позволяет автоматически корректировать некорректные или отсутствующие данные при десериализации, делая процесс более надёжным.
При разработке функции восстановления нужно учитывать, что в этой функции можно заменить значение, которое считано из JSON-документа, но нельзя изменить тип считываемого объекта. Функция восстановления также не будет вызываться для служебных свойств, которые создаются и используются системой «1С:Предприятие», например, #type, #ns и т. д.
Ограничения и ошибки при десериализации
При работе с десериализацией JSON в XDTO могут возникнуть следующие ошибки:
- Несовпадение типов. Если JSON содержит строку вместо числа, может возникнуть ошибка.
- Отсутствие обязательных полей. Если в JSON нет обязательного атрибута, объект XDTO может быть некорректным.
- Неизвестные структуры данных. Если JSON содержит дополнительные поля, не описанные в XDTO-схеме, это вызовет ошибку.
Для предотвращения этих проблем рекомендуется:
- Использовать явное указание типов при сериализации (НазначениеТипаXML.Явное).
- Проверять входные данные перед десериализацией.
- Использовать обработку ошибок и предобработку значений.
Теперь вы знаете, как преобразовывать JSON-данные в XDTO, работать с динамическими JSON-структурами и избегать ошибок при чтении данных. Далее рассмотрим практическое применение XDTO и JSON в интеграции с API и веб-сервисами.
Практические примеры и рекомендации
Интеграция 1С с внешними API через JSON и XDTO
JSON стал стандартом при взаимодействии с веб-сервисами, особенно с REST API. Использование XDTO позволяет удобно сериализовать и десериализовать данные при обмене с внешними системами.
Пример запроса к API с использованием JSON:
Соединение = Новый HTTPСоединение(Хост, Порт);
Запрос = Новый HTTPЗапрос(ПутьНаСервере);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ОбъектXDTO = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);
Сообщить(ОбъектXDTO.ФИО);
КонецЕсли;
Этот код отправляет HTTP-запрос, получает JSON-ответ и преобразует его в объект XDTO.
Конвертация JSON в XML и обратно
Иногда требуется преобразовать JSON-данные в XML и наоборот. В XDTO это можно сделать с использованием сериализаторов.
Пример преобразования JSON в XML:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку('{ "ФИО": "Иванов Иван", "Возраст": 30 }');
ОбъектXDTO = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON, Тип("СправочникОбъект.Сотрудники"));
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
XMLСтрока = ЗаписьXML.Закрыть();
Сообщить(XMLСтрока);
Этот код превращает строку в формате JSON в XML.
Советы по оптимизации работы с JSON в 1С
- Используйте явное указание типов (НазначениеТипаXML.Явное).
- Логируйте JSON-ответы API перед десериализацией для упрощения отладки.
- Используйте обработку ошибок при чтении JSON (Попытка...Исключение).
- Очищайте JSON-данные перед обработкой (удаление лишних пробелов, контроль формата).
Выводы
Работа с JSON в XDTO — это мощный инструмент для интеграции 1С с внешними системами, REST API и веб-сервисами. Поддержка JSON в XDTO значительно упрощает процесс обмена данными, делая его более гибким и удобным.
Основные выводы:
- Сериализация и десериализация JSON в XDTO работают автоматически, сохраняя структуру объектов и поддерживая коллекции.
- Можно управлять типами данных, используя НазначениеТипаXML.Явное, что упрощает последующую обработку.
- Функции восстановления значений помогают корректно загружать JSON-данные, даже если в них присутствуют некорректные или нестандартные значения.
- XDTO сохраняет строгую структуру данных, но остаётся достаточно гибким, чтобы адаптироваться к различным форматам JSON.
- Интеграция 1С с API через JSON упрощается благодаря использованию HTTP-запросов и XDTO-объектов, что позволяет легко обмениваться структурированными данными.
- При работе с JSON важно тестировать схемы XDTO и логировать JSON-ответы API, чтобы избежать неожиданных ошибок и упрощать отладку.
Использование XDTO для работы с JSON даёт разработчику 1С удобный механизм для структурированной работы с данными, упрощая интеграционные процессы и обеспечивая надёжность в передаче информации между системами.