Работа с 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 из внешнего источника может содержать свойства, имена которых совпадают с используемыми во встроенном языке ключевыми словами, литералами и т. д. Например, нельзя использовать слово Тип в имени переменной, так как уже существует такой литерал (подробнее см. в Имена переменных). Это недопустимо, но для обхода таких ограничений можно использовать настройки из списков выше: ПсевдонимыСвойств при чтении и ИспользуемыеИменаСвойств при записи. Например:
@локально
структура ТестЗаписиВ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>, НастройкиЧтения)
    знч ТипОбъекта = ПрочитанныйОбъект.ПолучитьТип().ВСтроку() 
    знч ПредставлениеОбъекта = ПрочитанныйОбъект.ВСтроку()
     
    возврат  "Прочитан объекта типа: %ТипОбъекта\н\нСодержимое объекта: \н\н%ПредставлениеОбъекта"  
;