Что такое JSON
JSON (JavaScript Object Notation) — это текстовый формат обмена данными, основанный на синтаксисе языка JavaScript. Несмотря на происхождение, JSON давно стал универсальным стандартом передачи данных между различными системами и языками программирования. По сравнению с XML он более лаконичен и занимает меньше места. Все современные браузеры имеют встроенные средства для работы с JSON, что делает его идеальным выбором для веб-интеграций. Платформа 1С:Предприятие предоставляет развитые средства для работы с этим форматом, начиная с версии 8.3.6.
JSON строится на двух основных структурах данных:
- Коллекция пар «ключ — значение» (в разных языках реализуется как объект, структура, словарь или ассоциативный массив)
- Упорядоченный список значений (реализуется как массив, список или вектор)
В JSON поддерживаются следующие типы данных:
| Тип | Описание | Пример |
|---|---|---|
| Строка | Текст в двойных кавычках | "Привет" |
| Число | Целое или с плавающей точкой | 123, 45.67 |
| Булево | Логическое значение | true, false |
| null | Пустое значение | null |
| Объект | Коллекция пар «ключ: значение» в фигурных скобках | {"имя": "Иван"} |
| Массив | Упорядоченный список значений в квадратных скобках | [1, 2, 3] |
Пример JSON документа:
{
"имя": "Иван Петров",
"возраст": 35,
"женат": true,
"телефоны": ["+7-999-123-45-67", "+7-916-987-65-43"],
"адрес": null
}JSON обладает несколькими важными преимуществами:
- человекочитаемый формат;
- компактность по сравнению с XML;
- поддерживается практически всеми современными технологиями;
- легко преобразуется в структуры данных большинства языков программирования.
Работа с JSON в 1С
Поддержка JSON появилась в платформе 1С:Предприятие 8.3 и постепенно расширялась от версии к версии.
При работе с JSON постоянно встречаются два понятия — сериализация и десериализация.
Сериализация — это преобразование данных программы в формат, который можно сохранить или передать другой системе. В нашем случае данные 1С превращаются в JSON. Десериализация — обратная операция
Например, мы можем сформировать в 1С данные заказа, сериализовать их в JSON и отправить интернет-магазину. В ответ магазин также вернет JSON, который 1С десериализует и сможет обработать уже привычными средствами встроенного языка.
В платформе есть три основных уровня работы с JSON: потоковая работа, объектная работа и сериализация с помощью XDTO. Они решают похожие задачи, но предназначены для разных ситуаций.
Потоковая работа с JSON
Потоковый способ — самый низкоуровневый и одновременно самый гибкий. Для него используются объекты:
- ЗаписьJSON;
- ЧтениеJSON.
При таком подходе мы сами последовательно записываем или читаем элементы JSON: начало объекта, свойства, значения, массивы и так далее. Допустим, нужно получить такой JSON:
{
"name": "Иван",
"age": 30
}Сформировать его можно следующим образом:
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("name");
Запись.ЗаписатьЗначение("Иван");
Запись.ЗаписатьИмяСвойства("age");
Запись.ЗаписатьЗначение(30);
Запись.ЗаписатьКонецОбъекта();
СтрокаJSON = Запись.Закрыть();Преимущество такого подхода — полный контроль над получаемым JSON. Мы сами решаем, какие свойства записывать, в каком порядке и в какой момент. Но за эту гибкость приходится платить количеством кода. Если нужно просто преобразовать обычную структуру 1С в JSON, вручную записывать каждое свойство обычно нет смысла.
Еще одно преимущество потокового способа — возможность работать с документом последовательно, не формируя его целиком в памяти. Поэтому он особенно полезен для больших JSON-файлов и других случаев, когда объем данных значителен.
Объектная работа с JSON
В большинстве интеграций удобнее сначала представить данные обычными объектами 1С — структурами и массивами, а затем целиком преобразовать их в JSON.
Например:
Данные = Новый Структура;
Данные.Вставить("name", "Иван");
Данные.Вставить("age", 30);
Данные.Вставить("online", Истина);Для сериализации можно использовать ЗаписатьJSON():
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
СтрокаJSON = Запись.Закрыть();В результате получится:
{
"name": "Иван",
"age": 30,
"online": true
}В потоковом варианте мы сами записывали каждое свойство. Здесь же мы сначала создали готовую структуру 1С, а ЗаписатьJSON() уже самостоятельно преобразовал ее в JSON.
Также можно работать с вложенными структурами и массивами:
Заказ = Новый Структура;
Заказ.Вставить("number", "000001");
Товары = Новый Массив;
Товар = Новый Структура;
Товар.Вставить("name", "Ноутбук");
Товар.Вставить("quantity", 2);
Товары.Добавить(Товар);
Заказ.Вставить("items", Товары);После сериализации получим:
{
"number": "000001",
"items": [
{
"name": "Ноутбук",
"quantity": 2
} ]
}При чтении происходит обратный процесс. Допустим, внешняя система вернула:
{
"success": true,
"orderId": 157
}Прочитать его можно так:
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();После этого результат можно использовать как обычную структуру.
Начиная с платформы 8.3.23 появился еще более простой вариант объектной работы: ЗаписатьЗначениеJSON и ПрочитатьЗначениеJSON. Здесь вообще не нужно самостоятельно создавать ЗаписьJSON или ЧтениеJSON.
То есть вместо:
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
СтрокаJSON = Запись.Закрыть();можно просто написать:
СтрокаJSON = ЗаписатьЗначениеJSON(Данные);Сама 1С рекомендует использовать эти функции там, где их возможностей достаточно. Они были добавлены именно как более простой вариант для большинства прикладных задач.
Сериализация через XDTO
У обычной объектной сериализации есть ограничение — она работает с простыми типами и коллекциями, но в 1С существует множество собственных прикладных типов. Например:
- СправочникСсылка.Номенклатура
- ДокументОбъект.ЗаказКлиента
- ТаблицаЗначений
- СписокЗначений
Если нужно сериализовать такие данные с сохранением информации об их типах, используется механизм XDTO.
Это третий уровень работы с JSON, который появился именно для сериализации прикладных типов 1С. Платформа позволяет сериализовать через XDTO ссылки, объекты, наборы записей и другие типы, для которых поддерживается XDTO-сериализация.
Здесь важно поговорить красто о двух связанных понятиях — ФабрикаXDTO и СериализаторXDTO.
ФабрикаXDTO содержит описание доступных XDTO-пакетов и типов, позволяет создавать XDTO-объекты и работать с их моделью. Говоря просым языком мы создаем некий шаблон модели или ее чертеж.
СериализаторXDTO используетсяЮ когда нужно непосредственно превратить обычный объект 1С в JSON и затем восстановить его обратно. Можно сказать, что это инструмент, который создает объект по шаблону или чертежу фабрики.
Например:
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("000001");
НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON( Запись, НоменклатураОбъект , НазначениеТипаXML.Явное );
СтрокаJSON = Запись.Закрыть();При десериализации используется обратная операция:
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Объект = СериализаторXDTO.ПрочитатьJSON(Чтение);
Чтение.Закрыть();Главное отличие от обычного JSON заключается в том, что XDTO сохраняет информацию, необходимую для восстановления типов 1С. За это приходится платить структурой самого JSON. Он получается более служебным и менее удобным для чтения человеком. В нем могут появляться дополнительные сведения о типах.
Как выбрать, какой метод использовать
Ниже приведены случае, когда лучше использовать каждый из представленных методов
Потоковый метод:
- JSON имеет сложную или нестандартную структуру;
- требуется точно контролировать формируемый документ;
- данные нужно записывать или читать постепенно;
- JSON настолько большой, что нежелательно полностью загружать его в память.
Объектный метод:
- REST API;
- обмен с сайтом;
- мобильные приложения;
- получение данных от внешних сервисов;
- отправка структурированных данных;
- небольшие и средние JSON-документы.
Через объекты XDTO:
- обмен данными между двумя информационными базами 1С, когда важно сохранить типы передаваемых значений;
- передача ссылок на объекты 1С, например СправочникСсылка.Номенклатура или ДокументСсылка.ЗаказКлиента;
- сериализация объектов 1С с большим количеством реквизитов без ручного преобразования каждого из них в структуру;
- передача сложных прикладных типов 1С, которые нельзя напрямую представить обычными строками, числами, структурами и массивами