При интеграции 1С с внешними REST API по протоколу HTTP в ответе сервера часто приходит JSON-структура в виде текстовой строки. Создание временных файлов на диске для последующего разбора данных создает лишнюю нагрузку на дисковую подсистему. Встроенные средства платформы 1С позволяют распарсить JSON напрямую из строки или потока в объекты 1С (Соответствие, Структура, Массив).
Разберем подробнее, как правильно преобразовать JSON-строку в объекты 1С и какие нюансы следует учитывать.
Рассмотрим базовый сценарий, когда в результате выполнения HTTP-запроса через метод HTTPОтвет.ПолучитьТелоКакСтроку() была получена JSON-строка. Для ее десериализации создается объект ЧтениеJSON, после чего вызывается глобальная функция ПрочитатьJSON().
Посмотрим на пример кода:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(РезультатТекст);
РезультатСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
Обратим внимание на второй параметр функции ПрочитатьJSON() — ПрочитатьВСоответствие:
Истина: платформенные объекты JSON преобразуются в коллекцию типа Соответствие. Это наиболее безопасный способ. Если ключи в JSON содержат дефисы, точки, пробелы или начинаются с цифры (например, "user-id" или "123"), Соответствие успешно их прочитает.Ложь (по умолчанию): данные читаются в объект Структура. Если ключ JSON не соответствует правилам именования идентификаторов в 1С, платформа вызовет критическую ошибку.Начиная с платформы 8.3.10, у объекта HTTPОтвет доступен метод ПолучитьТелоКакПоток(). Это позволяет передавать данные из сети сразу в объект чтения JSON, избегая промежуточного формирования больших строк в оперативной памяти.
Проанализируем пример обработки сетевого ответа через поток:
// Выполнение HTTP-запроса
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
// Чтение данных напрямую из потока
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьПоток(HTTPОтвет.ПолучитьТелоКакПоток());
// Десериализация JSON в объект 1С
РезультатСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
Использование потока оптимизирует работу с памятью и гарантирует правильную обработку кодировки UTF-8 и спецсимволов BOM (Byte Order Mark).
Выясним ключевые нюансы, с которыми можно столкнуться при парсинге JSON-данных в 1С:
Строка. Чтобы считывать их в тип Дата, в функцию ПрочитатьJSON() нужно передать массив или строку с именами полей в параметр ИменаСвойствСДатами и указать параметр ОжидаемыйФорматДаты (например, ФорматДатыJSON.ISO).ПрочитатьJSON() полностью загружает весь документ в память (DOM-модель). Если размер ответа составляет сотни мегабайт, предпочтительнее использовать последовательное потоковое чтение, перебирая узлы вызовом метода Прочитать() объекта ЧтениеJSON и анализируя свойство ВидУзла.Число. Для таких значений рекомендуется использовать строковый формат на стороне сервиса или обрабатывать их потоковым методом.