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

Чтение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.

Неопределено, если:

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

Значение​

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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


Методы​

ЗаписатьСодержимоеBase64ВПоток​

ЗаписатьСодержимоеBase64ВПоток(ПотокЗаписи: ПотокЗаписи)
Записывает содержимое строкового узла JSON в формате Base64 в ПотокЗаписи. Для текущего узла может быть вызван только один раз.

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

Исключения​

  • ИсключениеЧтенияJson — выбрасывается в следующих случаях:
    • Тип текущего узла не Строка.
    • Строка не в формате Base64.
    • Метод уже был вызван для текущего узла.

ЗаписатьСодержимоеВПоток​

ЗаписатьСодержимоеВПоток(ПотокЗаписи: ПотокЗаписи)
Записывает содержимое строкового узла JSON в ПотокЗаписи. Для текущего узла может быть вызван только один раз.

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

Исключения​


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

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

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

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

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

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

В режиме совместимости 10.0 и выше после вызова этого метода следует вызывать метод Следующий. Это необходимо для перехода к чтению следующего элемента, так как при чтении содержимого объектов и массивов позиция устанавливается на конец элемента, а для литеральных типов она не меняется.

В режиме совместимости ниже 10.0 вызывать метод Следующий не требуется, так как после вызова метода позиция чтения всегда устанавливается на следующий элемент.

Исключения​

  • ИсключениеЧтенияJson — если данные в исходном тексте JSON не получается прочитать как тип данных, указанный в структуре. Также исключение будет выброшено, если ЧтениеJson позиционируется на неподходящем виде узла.
    • Если ТипОбъекта — Массив или Множество, ожидается, что текущий узел — это НачалоМассива.
    • Если ТипОбъекта — Соответствие или структура, определенная в коде, ожидается, что текущий узел — это НачалоОбъекта.
    • Для остальных типов ожидается, что текущий узел соответствует типу ТипОбъекта.

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


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

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

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

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

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

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

В режиме совместимости 10.0 и выше после вызова этого метода следует вызывать метод Следующий. Это необходимо для перехода к чтению следующего элемента, так как при чтении содержимого объектов и массивов позиция устанавливается на конец элемента, а для литеральных типов она не меняется.

В режиме совместимости ниже 10.0 вызывать метод Следующий не требуется, так как после вызова метода позиция чтения всегда устанавливается на следующий элемент.

Исключения​

  • ИсключениеЧтенияJson — если данные в исходном тексте JSON не получается прочитать как тип данных, указанный в структуре. Также исключение будет выброшено, если ЧтениеJson позиционируется на неподходящем виде узла.
    • Если ТипОбъекта — Массив или Множество, ожидается, что текущий узел — это НачалоМассива.
    • Если ТипОбъекта — Соответствие или структура, определенная в коде, ожидается, что текущий узел — это НачалоОбъекта.
    • Для остальных типов ожидается, что текущий узел соответствует типу ТипОбъекта.

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


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

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

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

Исключения​

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

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

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

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

Исключения​


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

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

Исключения​


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

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

  • hh:mm:ss,
  • ISO 8601 и некоторых дополнительных форматах без указания часового пояса:
    • 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 8601 и некоторых дополнительных форматах без указания часового пояса:
    • 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 8601 и некоторых дополнительных форматах без указания часового пояса:

  • 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, если она записана как строка в формате ISO 8601.

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

Исключения​


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

@Устарело(Сообщение = "Используйте "ПрочитатьСодержимое(Настройки: НастройкиЧтенияОбъектовJson): ТипОбъекта"")
ПрочитатьСодержимоеКакМассив(): Массив<Объект?>
Читает массив объектов, начиная с текущей позиции. Вызывает метод ПрочитатьСодержимое<Массив<Объект?>>().


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

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

  • ISO 8601:
    • 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, то информация о часовом поясе игнорируется (этого бы не происходило, если бы конструировался тип, аналогичный типу ZonedDateTime в Java).

  • JavaScript (JavaScript)

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

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

Исключения​


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

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


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

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

Исключения​


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

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

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

Исключения​


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

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

Исключения​


Следующий​

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


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

Объект​

ВСтроку

ПолучитьТип

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