Чтение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(Источник: ПотокЧтения, Кодировка: Кодировка|Строка = Кодировка.Utf8)
ЧтениеJson
ЧтениеJson(
Источник: ПотокЧтения,
Кодировка: Кодировка|Строка = Кодировка.Utf8)Stream в кодировке Кодировка.
Перегрузка
ЧтениеJson(Источник: Строка)
Свойства
ВидУзла
ТолькоЧтение
ВидУзла: ВидУзлаJson?Вид текущего узла JSON.
Неопределено, если:
- чтение не было начато (не был вызван метод Следующий),
- чтение JSON завершилось (метод Следующий вернул
Ложь).
Значение
ТолькоЧтение
Значение: СтрокаТекстовое значение текущего узла JSON. Для комментариев содержит пустую строку. До начала и после окончания текста JSON возвращает пустую строку.
ТекущаяСтрока
ТолькоЧтение
ТекущаяСтрока: ЧислоТекущая строка в позиции чтения. Нумерация начинается с 1.
При чтении следующих видов значений позиция чтения находится сразу после прочтенного значения:
Null,Булево,Число,НачалоМассива,КонецМассив,НачалоОбъекта,КонецОбъекта.
При чтении значения вида Строка позиция находится сразу после открывающей кавычки.
При чтении значения вида ИмяСвойства позиция устанавливается после соответствующего значения этого свойства. Т. е. при чтении имени свойства в паре "value": false, когда очередь дойдет до "value", позиция чтения будет находиться после Ложь.
ТекущийСтолбец
ТолькоЧтение
ТекущийСтолбец: ЧислоТекущий столбец в позиции чтения. Нумерация начинается с 1.
Методы
ЗаписатьСодержимоеBase64ВПоток
ЗаписатьСодержимоеBase64ВПоток(ПотокЗаписи: ПотокЗаписи)Base64 в ПотокЗаписи. Для текущего узла может быть вызван только один раз.
После вызова метода позиция чтения не изменяется.
Исключения
- ИсключениеЧтенияJson — выбрасывается в следующих случаях:
ЗаписатьСодержимоеВПоток
ЗаписатьСодержимоеВПоток(ПотокЗаписи: ПотокЗаписи)ПотокЗаписи. Для текущего узла может быть вызван только один раз.
После вызова метода позиция чтения не изменяется.
Исключения
- ИсключениеЧтенияJson — выбрасывается в следующих случаях:
- Тип текущего узла не Строка.
- Метод уже был вызван для текущего узла.
ПрочитатьСодержимое
ПрочитатьСодержимое<ТипОбъекта>(Настройки: НастройкиЧтенияОбъектовJson): ТипОбъектаСчитывает объект JSON, начиная с текущей позиции, в объект типа ТипОбъекта с указанными настройками. Можно читать объекты любого типа, объявленного в коде (структура, Перечисление), и некоторых встроенных типов:
- Коллекция:
- Соответствие,
- Строка,
- Число,
- Булево,
- Момент,
- ДатаВремя,
- Дата,
- Время,
- Длительность,
- Ууид,
- Версия,
- Перечисление,
- Байты.
Сопоставление полей и свойств происходит следующим образом:
Истина,Ложьотображаются в Булево,- любая строка отображается в Строка,
- любое число отображается в Число,
- объект
{ ... }отображается в структуру или Соответствие, - массив
[ ... ]отображается в Массив или Множество, - строка в формате Момент или ДатаВремя отображается в Момент или ДатаВремя,
- строка в формате Ууид отображается в Ууид,
- строка в формате Версия отображается в Версия.
Имя свойства в структуре сопоставляется с именем свойства в исходном JSON.
Если необходимого поля структуры нет в читаемом тексте JSON, тогда значение поле устанавливается в Неопределено.
В режиме совместимости 10.0 и выше после вызова этого метода следует вызывать метод Следующий. Это необходимо для перехода к чтению следующего элемента, так как при чтении содержимого объектов и массивов позиция устанавливается на конец элемента, а для литеральных типов она не меняется.
В режиме совместимости ниже 10.0 вызывать метод Следующий не требуется, так как после вызова метода позиция чтения всегда устанавливается на следующий элемент.
Исключения
- ИсключениеЧтенияJson — если данные в исходном тексте JSON не получается прочитать как тип данных, указанный в структуре.
Также исключение будет выброшено, если
ЧтениеJsonпозиционируется на неподходящем виде узла.- Если
ТипОбъекта— Массив или Множество, ожидается, что текущий узел — этоНачалоМассива. - Если
ТипОбъекта— Соответствие или структура, определенная в коде, ожидается, что текущий узел — этоНачалоОбъекта. - Для остальных типов ожидается, что текущий узел соответствует типу
ТипОбъекта.
- Если
ПрочитатьСодержимое
ПрочитатьСодержимое<ТипОбъекта>(
Тип: Тип<ТипОбъекта>,
Настройки: НастройкиЧтенияОбъектовJson
): ТипОбъектаСчитывает объект JSON, начиная с текущей позиции, в объект типа ТипОбъекта с указанными настройками. Можно читать объекты любого типа, объявленного в коде (структура, Перечисление), и некоторых встроенных типов:
- Коллекция:
- Соответствие,
- Строка,
- Число,
- Булево,
- Момент,
- ДатаВремя,
- Дата,
- Время,
- Длительность,
- Ууид,
- Версия,
- Перечисление,
- Байты.
Сопоставление полей и свойств происходит следующим образом:
Истина,Ложьотображаются в Булево,- любая строка отображается в Строка,
- любое число отображается в Число,
- объект
{ ... }отображается в структуру или Соответствие, - массив
[ ... ]отображается в Массив или Множество, - строка в формате Момент или ДатаВремя отображается в Момент или ДатаВремя,
- строка в формате Ууид отображается в Ууид,
- строка в формате Версия отображается в Версия.
Имя свойства в структуре сопоставляется с именем свойства в исходном JSON.
Если необходимого поля структуры нет в читаемом тексте JSON, тогда значение поле устанавливается в Неопределено.
В режиме совместимости 10.0 и выше после вызова этого метода следует вызывать метод Следующий. Это необходимо для перехода к чтению следующего элемента, так как при чтении содержимого объектов и массивов позиция устанавливается на конец элемента, а для литеральных типов она не меняется.
В режиме совместимости ниже 10.0 вызывать метод Следующий не требуется, так как после вызова метода позиция чтения всегда устанавливается на следующий элемент.
Исключения
- ИсключениеЧтенияJson — если данные в исходном тексте JSON не получается прочитать как тип данных, указанный в структуре.
Также исключение будет выброшено, если
ЧтениеJsonпозиционируется на неподходящем виде узла.- Если
ТипОбъекта— Массив или Множество, ожидается, что текущий узел — этоНачалоМассива. - Если
ТипОбъекта— Соответствие или структура, определенная в коде, ожидается, что текущий узел — этоНачалоОбъекта. - Для остальных типов ожидается, что текущий узел соответствует типу
ТипОбъекта.
- Если
Перегрузка
ПрочитатьСодержимое<ТипОбъекта>(Настройки: НастройкиЧтенияОбъектовJson): ТипОбъекта
ПрочитатьСодержимоеКакБайты
ПрочитатьСодержимоеКакБайты(): Байты[A-Fa-f0-9], которые могут быть разделены пробелами в произвольных местах.
После вызова метода позиция чтения не изменяется.
Исключения
- ИсключениеЧтенияJson — если строка не является шестнадцатеричным представлением последовательности символов.
ПрочитатьСодержимоеКакБайтыBase64
ПрочитатьСодержимоеКакБайты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 — если указан часовой пояс, задан неправильный формат даты, или в представлении даты есть ненулевое время.
ПрочитатьСодержимоеКакДатаВремя
ПрочитатьСодержимоеКакДатаВремя(): ДатаВремя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 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 — если тип текущего узла не Число.
Следующий
Следующий(): Булево