Выполняет чтение значения JSON.
Синтаксис
Прочитать()Примеры платформы
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("c:/docs/data.json");
ЧтениеJSON.Прочитать()Полное описание, параметры и ограничения
ЧтениеJSON.Прочитать (JSONReader.Read)
ЧтениеJSON (JSONReader)
Прочитать (Read)
Доступен, начиная с версии 8.3.6.
Синтаксис:
Прочитать()
Возвращаемое значение:
Тип: Булево.
Истина - очередной узел прочитан;
Ложь - достигнут конец текста JSON.
Описание:
Выполняет чтение значения JSON.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Пример:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("c:/docs/data.json");
ЧтениеJSON.Прочитать()
Использование в версии:
Доступен, начиная с версии 8.3.6.
Методическая информация
Практические примеры
Пропустить вложенную диагностику и не потерять следующее поле
В debug лежит quantity=999, но это не количество товара. Пропускаем контейнер целиком и читаем только корневое quantity=3.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Все исходные JSON-строки и значения заданы в коде. Файлы, токены доступа, интернет и рабочая база не нужны.
Не подставляйте в упражнения ответы реального API с персональными данными. Сначала проверяйте неизменённый учебный набор.
Текст = "{""debug"":{""quantity"":999,""trace"":[1,2,3]},""quantity"":3}";
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Текст);
КоличествоТовара = Неопределено;
ПропущеноДиагностик = 0;
Попытка
ЕстьТокен = Чтение.Прочитать();
Пока ЕстьТокен Цикл
Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
Если Чтение.ТекущееЗначение = "debug" Тогда
Если Не Чтение.Прочитать() Тогда
ВызватьИсключение "Нет значения debug";
КонецЕсли;
Если Чтение.ТипТекущегоЗначения <> ТипЗначенияJSON.НачалоОбъекта Тогда
ВызватьИсключение "В учебном контракте debug должен быть объектом";
КонецЕсли;
ЕстьТокен = Чтение.Пропустить();
ПропущеноДиагностик = ПропущеноДиагностик + 1;
Продолжить;
ИначеЕсли Чтение.ТекущееЗначение = "quantity" Тогда
Если Не Чтение.Прочитать() Тогда
ВызватьИсключение "Нет значения quantity";
КонецЕсли;
Если Чтение.ТипТекущегоЗначения <> ТипЗначенияJSON.Число Тогда
ВызватьИсключение "quantity должно быть числом";
КонецЕсли;
КоличествоТовара = Чтение.ТекущееЗначение;
КонецЕсли;
КонецЕсли;
ЕстьТокен = Чтение.Прочитать();
КонецЦикла;
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если КоличествоТовара <> 3 Или ПропущеноДиагностик <> 1 Тогда
ВызватьИсключение "Пропуск диагностического объекта выполнен неправильно";
КонецЕсли;
Сообщить(КоличествоТовара);Разбор по шагам
На имени debug выполняем Прочитать, чтобы попасть на начало его объекта.
Пропустить проходит содержимое и конец контейнера и получает следующий токен. Его результат сохраняем в ЕстьТокен.
Продолжить возвращает управление к условию цикла без дополнительного Прочитать: иначе потеряли бы имя следующего поля.
В quantity проверяем числовой токен и фиксированный итог; вложенное диагностическое 999 не принимается за количество товара.
Как проверить результат
Результат 3, пропущена ровно одна диагностика; 999 не является итоговым количеством.
Добавьте в trace ещё вложенный объект: Пропустить по-прежнему обходит debug целиком.
Замените корневое quantity на строку "3": проверка числового типа отклоняет ввод.
Ожидаемый результат
Корректно обработан токен сразу после пропущенного объекта на заданном учебном контракте.
На что обратить внимание
Это не универсальный валидатор JSON: для произвольных неизвестных контейнеров надо явно вести уровень вложенности.
Пропуск чтения не отменяет ограничений размера внешнего ответа и не заменяет проверку допустимых полей.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Посмотреть типы, значения и позиции при последовательном чтении JSON
Не загружаем структуру целиком: последовательно читаем токены и считаем имена свойств. Null, число и строка различаются по типу токена.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Все исходные JSON-строки и значения заданы в коде. Файлы, токены доступа, интернет и рабочая база не нужны.
Не подставляйте в упражнения ответы реального API с персональными данными. Сначала проверяйте неизменённый учебный набор.
Текст = "{""name"":""Книга"",""quantity"":3,""enabled"":true,""tags"":[""paper""],""note"":null}";
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Текст);
ЧислоИмен = 0;
Попытка
Пока Чтение.Прочитать() Цикл
Сообщить(СтрШаблон("Строка %1; позиция %2; тип %3; значение %4",
Чтение.ТекущаяСтрока, Чтение.ТекущаяПозиция,
Чтение.ТипТекущегоЗначения, Чтение.ТекущееЗначение));
Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
ЧислоИмен = ЧислоИмен + 1;
КонецЕсли;
КонецЦикла;
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ЧислоИмен <> 5 Тогда
ВызватьИсключение "В учебном объекте ожидалось пять имён свойств";
КонецЕсли;
Сообщить(ЧислоИмен);Разбор по шагам
Прочитать перемещает состояние на очередной JSON-токен; Ложь означает конец входа.
Имя свойства и его значение — разные токены. Начало и конец массива/объекта тоже встречаются при чтении.
ТипТекущегоЗначения отличает строку от числа, даже если отображаемые тексты похожи.
ТекущаяСтрока и ТекущаяПозиция помогают ориентироваться в документе. Это не индекс элемента массива данных.
Как проверить результат
Подсчитано 5 имён: name, quantity, enabled, tags, note.
Для quantity значение числовое 3; для элемента tags значение строковое paper.
Перенесите свойства на разные строки корректного JSON: содержимое не меняется, номера текущих строк меняются.
Ожидаемый результат
Получена карта последовательности токенов и мест в исходном тексте для изучения потокового JSON API.
На что обратить внимание
ТекущееЗначение не следует читать как готовый объект или массив в момент токена начала контейнера.
Позиции относятся к тексту JSON, не к байтам UTF-8 на диске. Не используйте их как файловые смещения.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.