Перейти к основному содержимому

ЧтениеJson

Стд::Json::ЧтениеJson

Объект, предназначенный для потокового чтения данных в формате JSON.

Методы чтения значений выбрасывают ИсключениеЧтенияJson - в следующих случаях:

  • не было начато чтение (не был вызван метод Следующий
  • чтение JSON завершилось (метод Следующий вернул Ложь)

Сравнение

Ссылочное

Иерархия типа

Базовые типы: Объект


Примеры

Общие примеры

Чтение JSON

Исходная строка JSON

[
{
"Ид": "d7ab92e4-484a-4e7c-a942-f9de21ded45b",
"ТабельныйНомер": 100101,
"Фамилия": "Иванов",
"Имя": "Иван",
"Отчество": "Иванович",
"ДатаНачалаРаботы": "2018-09-24",
"Должность": "Разработчик",
"ПерсональныеДанные": {
"ДатаРождения": "1977-11-23",
"ВоеннаяСлужба": true,
"АдресРегистрации": {
"НаселенныйПункт": "г. Москва",
"Улица": "ул. Проспект Мира",
"Дом": "11а",
"Квартира": 321
},
"ТелефонныйНомер": [
"+79991112233",
"84951234567"
]
}
},
{
"Ид": "cfdad0fb-84c5-417a-9aef-a90a1986598c",
"ТабельныйНомер": 100102,
"Фамилия": "Петров",
"Имя": "Петр",
"Отчество": "Петрович",
"ДатаНачалаРаботы": "2021-02-10",
"Должность": "Специалист техподдержки",
"ПерсональныеДанные": {
"ДатаРождения": "1990-05-01",
"ВоеннаяСлужба": false,
"АдресРегистрации": {
"НаселенныйПункт": "г. Неизвестный",
"Улица": "ул. Ленина",
"Дом": "5"
},
"ТелефонныйНомер": [
"+79993332211"
]
}
}
]

Код чтения JSON

// Структура для хранения сообщения Сотрудники
структура СтруктураСотрудникиЧтение
обз пер Сотрудники: Множество<СтруктураСотрудникЧтение>
;

// Структура для хранения сотрудника
структура СтруктураСотрудникЧтение
пер Ид: Ууид
пер ТабельныйНомер: Число
пер Фамилия: Строка
пер Имя: Строка
пер Отчество: Строка
пер ДатаНачалаРаботы: Дата
пер Должность: Строка
пер ПерсональныеДанные: СтруктураПерсональныеДанныеЧтение
;

// Структура для хранения персональных данных сотрудника
// Для необязательных полей используется составной тип с Неопределено
структура СтруктураПерсональныеДанныеЧтение
пер ДатаРождения: Дата
пер ВоеннаяСлужба: Булево
пер АдресРегистрации: СтруктураАдресРегистрацииЧтение
пер ТелефонныйНомер: Множество<Строка>?
;

// Структура для хранения адреса регистрации
// Для необязательных полей используется составной тип с Неопределено
структура СтруктураАдресРегистрацииЧтение
пер НаселенныйПункт: Строка
пер Улица: Строка
пер Дом: Строка
пер Квартира: Число?
;

метод ПрочитатьJsonСотрудники(СтрокаJson: Строка): СтруктураСотрудникиЧтение
// Объект чтения строки JSON
знч Чтение = новый ЧтениеJson(СтрокаJson)

// Переменные структур и объектов хранения данных
пер Сотрудники = новый СтруктураСотрудникиЧтение(новый Множество<СтруктураСотрудникЧтение>())

// Установка позиции на начало массива
// Если массив отсутствует, возвращается пустая СтруктураСотрудники
если не Чтение.Следующий()
возврат Сотрудники
;

// Установка позиции на первый элемент массива
// Если начало элемента отсутствует, возвращается пустая СтруктураСотрудники
если не Чтение.Следующий()
возврат Сотрудники
;

пока Чтение.ВидУзла != ВидУзлаJson.КонецМассива
// Для корректной работы метода ПрочитатьСодержимое требуется полное соответствие между целевой структурой и объектом JSON.
// Если стрктура не соответствует объекту, требуются настройки структуры через аннотации или
// использование типа НастройкиЧтенияОбъектовJson для метода чтения.
//
// Метод ПрочитатьСодержимое заполняет структуру СтруктураСотрудник данными объекта.
// Структура полностью соответствует объекту JSON, поэтому настройки чтения не используются.
// В случае успешного чтения позиция переставляется в конец текущего объекта, выполняется итерация чтения следующего объекта.
пер Сотрудник = Чтение.ПрочитатьСодержимое<СтруктураСотрудникЧтение>()
Сотрудники.Сотрудники.Добавить(Сотрудник)
;

возврат Сотрудники
;

Результат со строковым представлением объекта после чтения JSON

{
{Ид=d7ab92e4-484a-4e7c-a942-f9de21ded45b, ТабельныйНомер=100101, Фамилия=Иванов, Имя=Иван, Отчество=Иванович,
ДатаНачалаРаботы=2018-09-24, Должность=Разработчик, ПерсональныеДанные={ ДатаРождения=1977-11-23, ВоеннаяСлужба=true,
АдресРегистрации={НаселенныйПункт=г. Москва, Улица=ул. Проспект Мира, Дом=11а, Квартира=321},
ТелефонныйНомер={+79991112233, 84951234567}}},
{Ид=cfdad0fb-84c5-417a-9aef-a90a1986598c, ТабельныйНомер=100102, Фамилия=Петров, Имя=Петр, Отчество=Петрович,
ДатаНачалаРаботы=2021-02-10, Должность=Специалист техподдержки, ПерсональныеДанные={ДатаРождения=1990-05-01,
ВоеннаяСлужба=false, АдресРегистрации={НаселенныйПункт=г. Неизвестный, Улица=ул. Ленина, Дом=5, Квартира=undefined},
ТелефонныйНомер={+79993332211}}}
}

Чтение значений различных типов

Исходная строка JSON

[
[
"значение1",
"значение2"
],
{
"Имя": "значение"
},
{
"Строка": "Строка",
"Булево": true,
"Байты": "74657374",
"БайтыBase64": "dGVzdA",
"Время": "23:59:59.999",
"Дата": "2022-12-31",
"ДатаВремя": "2022-12-31 23:59:59.999",
"Длительность": "PT144H0.005S",
"МоментISO": "2020-04-16 20:30:40Z",
"МоментMicrosoft": "/Date(1587069040345)/",
"МоментJavascript": "1587069040345",
"Ууид": "d7ab92e4-484a-4e7c-a942-f9de21ded45b",
"Число": 123.45,
"Неопределено": null
}
]

Код чтения JSON

метод ПрочитатьJsonТипы(СтрокаJson: Строка)
// Объект чтения строки JSON
знч Чтение = новый ЧтениеJson(СтрокаJson)

// Начало JSON
Чтение.Следующий()

// Массив
Чтение.Следующий()
пер Массив = Чтение.ПрочитатьСодержимоеКакМассив() // [значение1, значение2]

// Соответствие
Чтение.Следующий()
пер Соответствие = Чтение.ПрочитатьСодержимоеКакСоответствие() // {Имя: значение}

// Свойства с типами
пока Чтение.Следующий()
если Чтение.ВидУзла == ВидУзлаJson.ИмяСвойства
если Чтение.Значение == "Строка"
Чтение.Следующий()
пер Строка = Чтение.ПрочитатьСодержимоеКакСтроку() // Строка

иначе если Чтение.Значение == "Булево"
Чтение.Следующий()
пер Булево = Чтение.ПрочитатьСодержимоеКакБулево() // Истина

иначе если Чтение.Значение == "Байты"
Чтение.Следующий()
пер Байты = Чтение.ПрочитатьСодержимоеКакБайты() // 74657374

иначе если Чтение.Значение == "БайтыBase64"
Чтение.Следующий()
пер БайтыBase64 = Чтение.ПрочитатьСодержимоеКакБайтыBase64() // 74657374

иначе если Чтение.Значение == "Время"
Чтение.Следующий()
пер Время = Чтение.ПрочитатьСодержимоеКакВремя() // 23:59:59.999

иначе если Чтение.Значение == "Дата"
Чтение.Следующий()
пер Дата = Чтение.ПрочитатьСодержимоеКакДата() // 2022-12-31

иначе если Чтение.Значение == "ДатаВремя"
Чтение.Следующий()
пер ДатаВремя = Чтение.ПрочитатьСодержимоеКакДатаВремя() // 2022-12-31 23:59:59.999
пер ВремяБезДаты = Чтение.ПрочитатьСодержимоеКакВремя(Истина) // 23:59:59.999
пер ДатаБезВремени = Чтение.ПрочитатьСодержимоеКакДата(Истина) // 2022-12-31

иначе если Чтение.Значение == "Длительность"
Чтение.Следующий()
пер Длительность = Чтение.ПрочитатьСодержимоеКакДлительность() // 144:00:00.005

иначе если Чтение.Значение == "МоментISO"
Чтение.Следующий()
пер МоментISO = Чтение.ПрочитатьСодержимоеКакМомент() // 2020-04-16T20:30:40.000Z

иначе если Чтение.Значение == "МоментMicrosoft"
Чтение.Следующий()
пер МоментMicrosoft = Чтение.ПрочитатьСодержимоеКакМомент() // 2020-04-16T20:30:40.000Z

иначе если Чтение.Значение == "МоментJavascript"
Чтение.Следующий()
пер МоментJavascript = Чтение.ПрочитатьСодержимоеКакМомент() // 2020-04-16T20:30:40.000Z

иначе если Чтение.Значение == "Ууид"
Чтение.Следующий()
пер Ууид = Чтение.ПрочитатьСодержимоеКакУуид() // d7ab92e4-484a-4e7c-a942-f9de21ded45b

иначе если Чтение.Значение == "Число"
Чтение.Следующий()
пер Число = Чтение.ПрочитатьСодержимоеКакЧисло() // 123.45

иначе если Чтение.Значение == "Неопределено"
Чтение.Следующий()
если Чтение.ВидУзла == ВидУзлаJson.Null
// Неопределено
;
;
;
;
;

Конструкторы

ЧтениеJson

ЧтениеJson(Источник: Строка)
Конструктор чтения JSON из строки Источник.

Перегрузка
ЧтениеJson(Источник: ПотокЧтения, Кодировка: Кодировка|Строка = Кодировка.Utf8)


ЧтениеJson

ЧтениеJson(
Источник: ПотокЧтения,
Кодировка: Кодировка|Строка = Кодировка.Utf8)
Конструктор чтения JSON из потока Stream в кодировке Кодировка.

Перегрузка
ЧтениеJson(Источник: Строка)


Свойства

ВидУзла

ТолькоЧтение

ВидУзла: ВидУзлаJson?

Вид текущего узла JSON.

Undefined, если:

  1. Не было начато чтение (не был вызван метод Следующий.
  2. Чтение JSON завершилось (метод Следующий вернул Ложь).

Значение

ТолькоЧтение

Значение: Строка

Текстовое значение текущего узла JSON. Для комментариев содержит пустую строку. До начала и после окончания текста JSON возвращает пустую строку.


ТекущаяСтрока

ТолькоЧтение

ТекущаяСтрока: Число

Текущая строка в позиции чтения. Нумерация начинается с 1.

При чтении следующих видов значений, позиция чтения находится сразу после прочтенного значения:

  • Null,
  • Булево,
  • Число,
  • НачалоМассива,
  • КонецМассив,
  • НачалоОбъекта,
  • КонецОбъекта.

При чтении значения вида Строка, позиция находится сразу после открывающей кавычки

При чтении значения вида ИмяСвойства, позиция находится на том же месте, что будет при чтении значения после имени свойства. Т.е. при чтении имени свойства в паре "value": false, когда дойдет очередь до "value", позиция будет сразу после false.


ТекущийСтолбец

ТолькоЧтение

ТекущийСтолбец: Число

Текущий столбец в позиции чтения. Нумерация начинается с 1.


Методы

ПрочитатьСодержимое

ПрочитатьСодержимое<ТипОбъекта>(Настройки: НастройкиЧтенияОбъектовJson): ТипОбъекта
ТипОбъекта: тип считываемого объекта.

Считывает объект JSON, начиная с текущей позиции, в объект типа ТипОбъекта, с настройками Настройки. Можно читать объекты любого типа, объявленного в коде (структура, Перечисление), и некоторых встроенных типов:

Сопоставление полей и свойств происходит следующим образом:

Имя свойства в структуре сопоставляется с именем свойства в исходном JSON.

Если необходимого поля структуры нет в читаемом тексте JSON, тогда значение поле устанавливается в Неопределено.

Исключения

ИсключениеЧтенияJson - если данные в исходном тексте JSON не получается прочитать как тип данных, указанный в структуре. Так же исключение будет выброшено в случае если ЧтениеJson позиционировано на неподходящем виде узла.

  • Если ТипОбъекта - Массив или Множество ожидается что текущий узел НачалоМассива.
  • Если ТипОбъекта - Соответствие или структура определенная в коде, ожидается что текущий узел НачалоОбъекта.
  • Для остальных типов ожидается что текущий узел соответствует типу ТипОбъекта.

ПрочитатьСодержимоеКакБайты

ПрочитатьСодержимоеКакБайты(): Байты
Читает содержимое узла JSON как шестнадцатеричное число и декодирует ее в байты. Разряды числа - символы из интервала [A-Fa-f0-9], которые могут быть разделены пробелами в произвольных местах. После вызова метода, позиция чтения не изменяется.

Исключения

ИсключениеЧтенияJson - если строка не является шестнадцатеричным представлением последовательности символов.


ПрочитатьСодержимоеКакБайтыBase64

ПрочитатьСодержимоеКакБайтыBase64(): Байты
Возвращает содержимое узла JSON, если это строка в формате Base64 и декодирует ее в байты. После вызова метода, позиция чтения не изменяется.

Исключения

ИсключениеЧтенияJson - если строка не в формате Base64


ПрочитатьСодержимоеКакБулево

ПрочитатьСодержимоеКакБулево(): Булево
Возвращает содержимое узла JSON, если он является логическим значением.

Исключения

ИсключениеЧтенияJson - если тип текущего узла не Булево


ПрочитатьСодержимоеКакВремя

ПрочитатьСодержимоеКакВремя(ИгнорироватьДату: Булево = Ложь): Время
Возвращает содержимое узла JSON, если это строка содержащая время, указанное в формате строковое представление hh:mm:ss или в представлении без часового пояса в формате:

ISO (ISO) и некоторых дополнительных:

  • YYYY[-,/,.]MM[-,/,.]DD([ ,T]hh:mm(:ss(.SSS)))
  • DD[-,/,.]MM[-,/,.]YYYY([ ,T]hh:mm(:ss(.SSS)))

Например:

  • "0001-01-01 22:01",
  • "0001-01-01 22:01:34.500",
  • "01.01.0001 22:01",
  • "01/01/0001 22:01.500".

Параметр ИгнорироватьДату позволяет читать строки содержащие ненулевую дату.

Например:

  • "2003-09-24 22:01",
  • "2003-09-24 22:01:34.500",
  • "24.09.2003 22:01",
  • "24/09/2003 22:01.500".

После вызова метода, позиция чтения не изменяется.

Исключения

ИсключениеЧтенияJson - если указан часовой пояс или формат времени неправильный или в представлении времени есть ненулевая дата.


ПрочитатьСодержимоеКакДата

ПрочитатьСодержимоеКакДата(ИгнорироватьВремя: Булево = Ложь): Дата
Возвращает содержимое узла JSON, если это строка содержащая дату, указанную в формате строковое представление: yyyy.mm.dd или в представлении без часового пояса в формате:

ISO (ISO) и некоторых дополнительных:

  • YYYY[-,/,.]MM[-,/,.]DD([ ,T]hh:mm(:ss(.SSS)))
  • DD[-,/,.]MM[-,/,.]YYYY([ ,T]hh:mm(:ss(.SSS)))

Например:

  • "2003-09-24 00:00",
  • "2003-09-24 00:00:00.000",
  • "24.09.2003 00:00",
  • "24/09/2003 00:00.000".

Параметр ИгнорироватьВремя позволяет читать строки содержащие ненулевое время.

Например:

  • "2003-09-24 22:01",
  • "2003-09-24 22:01:34.500",
  • "24.09.2003 22:01",
  • "24/09/2003 22:01.500".

После вызова метода, позиция чтения не изменяется.

Исключения

ИсключениеЧтенияJson - если указан часовой пояс или формат даты неправильный или в представлении даты есть ненулевое время.


ПрочитатьСодержимоеКакДатаВремя

ПрочитатьСодержимоеКакДатаВремя(): ДатаВремя
Возвращает содержимое узла JSON, если это строка содержащая дата-время, указанное в представлении без часового пояса в формате:

ISO (ISO) и некоторых дополнительных:

  • YYYY[-,/,.]MM[-,/,.]DD([ ,T]hh:mm(:ss(.SSS)))
  • DD[-,/,.]MM[-,/,.]YYYY([ ,T]hh:mm(:ss(.SSS)))

Например:

  • "2003-09-24 22:01",
  • "2003-09-24 22:01:34.500",
  • "24.09.2003 22:01",
  • "24/09/2003 22:01.500".

Если часовой пояс не указан, то время интерпретируется как местное.

Исключения

ИсключениеЧтенияJson - если указан часовой пояс или формат даты неправильный


ПрочитатьСодержимоеКакДлительность

ПрочитатьСодержимоеКакДлительность(): Длительность
Возвращает содержимое узла JSON, если это строка содержащая длительность, указанную в формате ISO) После вызова метода, позиция чтения не изменяется.

Исключения

ИсключениеЧтенияJson - если формат длительности неправильный,


ПрочитатьСодержимоеКакМассив

ПрочитатьСодержимоеКакМассив(): Массив<Объект?>
Читает массив объектов начиная с текущей позиции. Вызывает метод ПрочитатьСодержимое<Массив<Объект?>>().


ПрочитатьСодержимоеКакМомент

ПрочитатьСодержимоеКакМомент(): Момент
Возвращает содержимое узла JSON, если это строковое представление момента с часовым поясом, указанный в одном из форматов:

  • ISO (ISO):
    • YYYY[-,/,.]MM[-,/,.]DD([ ,T]hh:mm(:ss(.SSS)))[ ,]±h(h)(:mm),
    • DD[-,/,.]MM[-,/,.]YYYY([ ,T]hh:mm(:ss(.SSS)))[ ,]±h(h)(:mm).

Например:

  • "24.09.2003 22:01:34 +4",
  • "24.09.2003 22:01:34 +04",
  • "24.09.2003 22:01 +04:30",
  • "24.09.2003 22:01 03:00",
  • "24.09.2003+4",
  • "24.09.2003 +04",
  • "24/09/2003 Z",
  • "2003-09-24 22:01:34+3",
  • "2003-09-24 22:01:34-4:30",
  • "2003-09-24 22:01:34Z".

Обязательно наличие в формате часового пояса, иначе будет выброшено ИсключениеЧтенияJson.

  • Microsoft (Microsoft) Формат даты Microsoft вида:

    • /Date(1530144000000)/
    • /Date(1530144000000+hhmm)/

    Этот же вариант в формате JSON с экранированием будет выглядеть следующим образом: "\u002FDate(1530144000000+hhmm)\u002F". Дата указывается в формате Unix-времени. JSON поддерживает опциональное экранирование символа "/", поэтому для чтения допускаются оба варианта. Поскольку время указывается в формате UNIX, то информация о часовом поясе будет игнорироваться (не игнорировалось бы, если бы конструировался тип аналогичный типу Java - ZonedDateTime).

  • JavaScript (JavaScript)

    Указывается количество миллисекунд, прошедших с начала эры Unix (Unix Epoch) - полночь 1 января 1970 UTC.

Первый вызов пытается прочитать в каждом из форматов.

Исключения

ИсключениеЧтенияJson - если не указан часовой пояс или формат неправильный.


ПрочитатьСодержимоеКакСоответствие

ПрочитатьСодержимоеКакСоответствие(): Соответствие<Строка, Объект?>
Читает соответствие начиная с текущей позиции. Вызывает метод ПрочитатьСодержимое<Соответствие<Строка, Объект?>>().


ПрочитатьСодержимоеКакСтроку

ПрочитатьСодержимоеКакСтроку(): Строка
Возвращает содержимое узла JSON, если это строка.

Исключения

ИсключениеЧтенияJson - если тип текущего узла не Строка


ПрочитатьСодержимоеКакУуид

ПрочитатьСодержимоеКакУуид(): Ууид
Возвращает содержимое узла JSON, если это строка содержащая содержащее представление uuid. После вызова метода, позиция чтения не изменяется.

Исключения

ИсключениеЧтенияJson - если формат uuid неправильный


ПрочитатьСодержимоеКакЧисло

ПрочитатьСодержимоеКакЧисло(): Число
Возвращает содержимое узла JSON, если это числовое значение.

Исключения

ИсключениеЧтенияJson - если тип текущего узла не Число


Следующий

Следующий(): Булево
Считывает очередной узел JSON. При этом свойству ВидУзла присваивается значение, соответствующие прочитанным данным. Возвращает признак, что был следующий элемент.


Список унаследованных методов

Объект

ВСтроку

ПолучитьТип

Представление