Работа с JSON
Для работы с данными в формате JSON предназначены типы ЧтениеJson и ЗаписьJson. Они обеспечивают потоковое чтение и потоковую запись JSON.
Кроме того, вы можете автоматически преобразовывать в/из JSON многие типы встроенного языка.
Поддержка комментариев
При чтении JSON поддерживаются однострочные комментарии, введенные в версии JSON5 формата JSON.
Комментарий начинается с символов //
и заканчивается с концом строки.
Содержимое комментария при чтении JSON игнорируется, то есть результат чтения JSON не
включает содержимого комментариев и не содержит какой-либо информации о наличии
комментариев.
Сериализация в формат JSON и десериализация
«1С:Исполнитель» обеспечивает сериализацию в формат JSON и обратную операцию — десериализацию. Основным типом для выполнения этих операций является СериализацияJson. Экземпляр этого типа вы можете получить из свойства глобального контекста СериализацияJson. Методы этого типа позволяют:
- прочитать значение JSON в экземпляр типа, поддерживаемого «1С:Исполнителем» — ПрочитатьОбъект(),
- прочитать значение JSON в Соответствие — ПрочитатьСоответствие(),
- прочитать значение JSON в Массив — ПрочитатьМассив(),
- записать экземпляр типа, поддерживаемого «1С:Исполнителем», в значение JSON в поток — ЗаписатьОбъект(ПотокЗаписи, Объект, НастройкиЗаписиОбъектовJson),
- записать экземпляр типа, поддерживаемого «1С:Исполнителем», в значение JSON в строку — ЗаписатьОбъект(Объект, НастройкиЗаписиОбъектовJson): Строка,
Если в структуре описание типа какого-либо поля включает Неопределено
(например, пер Поле1: Строка?
или
пер Поле1: Строка | Неопределено
), то при чтении JSON в эту структуру методом
СериализацияJson.ПрочитатьОбъект
при отсутствии этого поля в JSON полю будет присвоено значение
Неопределено
.
Для настройки сериализации и десериализации существуют типы настроек со свойствами. Экземпляры этих типов используются в перечисленных выше методах:
- Тип НастройкиЧтенияОбъектовJson:
- Кодировка — кодировка, которая будет использована при чтении из потока;
- ПсевдонимыCвойств — псевдонимы для имени свойства JSON для конкретного свойства структуры;
- ИгнорироватьНеизвестныеСвойства — признак игнорирования неизвестных (лишних) полей в тексте JSON.
- тип НастройкиЗаписиОбъектовJson:
- ИспользуемыеИменаСвойств — устанавливает признак изменения записываемого имени свойства по аналогии с
@JsonProperty
, - ИгнорируемыеСвойства — устанавливает признак игнорирования в результирующем экземпляре JSON определенных свойств,
- ЗаписьСвойствБезОбработки — свойства, которые будут записаны без обработки («как есть»),
- РежимЗаписиТипаЗначенияJson — способ записи информации о типе значения.
- ИспользуемыеИменаСвойств — устанавливает признак изменения записываемого имени свойства по аналогии с
В типе ЧтениеJson существуют методы для чтения значения JSON в один из конкретных типов:
- ПрочитатьСодержимоеКакДата(),
- ПрочитатьСодержимоеКакВремя(),
- ПрочитатьСодержимоеКакДлительность(),
- ПрочитатьСодержимоеКакБайты().
Также в ЧтениеJson существуют свойства для определения текущей строки и текущего столбца в позиции чтения:
- ТекущаяСтрока,
- ТекущийСтолбец.
Тип
в имени переменной, так как уже существует такой литерал
(подробнее см. в Имена переменных). Это недопустимо, но для обхода таких
ограничений можно использовать настройки из списков выше:
ПсевдонимыСвойств
при чтении и
ИспользуемыеИменаСвойств
при записи.
Например:@локально
структура ТестЗаписиВJson
пер Строка: Строка
пер Число: Число
пер Дата: Дата
пер Время: Время
пер ДатаВремя: ДатаВремя
пер Массив: Массив<Строка>
пер Множество: Множество<Число>
пер Объект: Справочник1.Объект
пер Байты: Байты
пер ТипЗначения: Строка
;
метод ТестСериализацииJSON(Запрос: HttpСервисЗапрос)
пер Результат = ""
пер Ответ = Запрос.Ответ
пер СтрокаJSON = СериализоватьСтруктуру()
пер СтрокаИзJSON = ДесериализоватьСтруктуру(СтрокаJSON)
Результат =
"Результат сериализации: \н\н
%СтрокаJSON \н\н
Результат ДЕсериализации: \н\н
%СтрокаИзJSON \н\н"
Ответ.УстановитьТело(Результат)
;
метод СериализоватьСтруктуру(): Строка
знч НастройкиЗаписи = новый НастройкиЗаписиОбъектовJson()
НастройкиЗаписи.ИспользуемыеИменаСвойств.Вставить(Тип<ТестЗаписиВJson>, {"ТипЗначения":"type"})
знч ОбъектСправочника = новый Справочник1.Объект()
ОбъектСправочника.Наименование = "Тестовый абонент"
ОбъектСправочника.Код = "123456"
знч Объект = новый ТестЗаписиВJson(Строка = "ТестоваяСтрока",
Число = 123,
Дата = Дата.Сейчас(),
Время = Время.Сейчас(),
ДатаВремя = ДатаВремя.Сейчас(),
Массив = ["Тестовый", "Массив", "Строка"],
Множество = {9,8,7,6},
Объект = ОбъектСправочника,
Байты = ПолучитьДДФайла(),
ТипЗначения = "ОписаниеТипаЗначения")
пер ТекстJSON = СериализацияJson.ЗаписатьОбъект(Объект, НастройкиЗаписи)
возврат ТекстJSON
;
метод ДесериализоватьСтруктуру(СтрокаJSON: Строка): Строка
знч Псевдонимы = {
"ТипЗначения": {"type"}
}
знч НастройкиЧтения = новый НастройкиЧтенияОбъектовJson()
НастройкиЧтения.ПсевдонимыСвойств[Тип<ТестЗаписиВJson>] = Псевдонимы
знч ПрочитанныйОбъект = СериализацияJson.ПрочитатьОбъект(СтрокаJSON, Тип<ТестЗаписиВJson>, НастройкиЧтения)
знч ТипОбъекта = ПрочитанныйОбъект.ПолучитьТип().ВСтроку()
знч ПредставлениеОбъекта = ПрочитанныйОбъект.ВСтроку()
возврат "Прочитан объекта типа: %ТипОбъекта\н\нСодержимое объекта: \н\н%ПредставлениеОбъекта"
;