ЧтениеJSON.Прочитать

Методы · Read

Выполняет чтение значения 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.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Все исходные JSON-строки и значения заданы в коде. Файлы, токены доступа, интернет и рабочая база не нужны.

  2. Не подставляйте в упражнения ответы реального API с персональными данными. Сначала проверяйте неизменённый учебный набор.


Текст = "{""debug"":{""quantity"":999,""trace"":[1,2,3]},""quantity"":3}";
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Текст);
КоличествоТовара = Неопределено;
ПропущеноДиагностик = 0;
Попытка
    ЕстьТокен = Чтение.Прочитать();
    Пока ЕстьТокен Цикл
        Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
            Если Чтение.ТекущееЗначение = "debug" Тогда
                Если Не Чтение.Прочитать() Тогда
                    ВызватьИсключение "Нет значения debug";
                КонецЕсли;
                Если Чтение.ТипТекущегоЗначения <> ТипЗначенияJSON.НачалоОбъекта Тогда
                    ВызватьИсключение "В учебном контракте debug должен быть объектом";
                КонецЕсли;
                ЕстьТокен = Чтение.Пропустить();
                ПропущеноДиагностик = ПропущеноДиагностик + 1;
                Продолжить;
            ИначеЕсли Чтение.ТекущееЗначение = "quantity" Тогда
                Если Не Чтение.Прочитать() Тогда
                    ВызватьИсключение "Нет значения quantity";
                КонецЕсли;
                Если Чтение.ТипТекущегоЗначения <> ТипЗначенияJSON.Число Тогда
                    ВызватьИсключение "quantity должно быть числом";
                КонецЕсли;
                КоличествоТовара = Чтение.ТекущееЗначение;
            КонецЕсли;
        КонецЕсли;
        ЕстьТокен = Чтение.Прочитать();
    КонецЦикла;
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если КоличествоТовара <> 3 Или ПропущеноДиагностик <> 1 Тогда
    ВызватьИсключение "Пропуск диагностического объекта выполнен неправильно";
КонецЕсли;
Сообщить(КоличествоТовара);

Разбор по шагам

  1. На имени debug выполняем Прочитать, чтобы попасть на начало его объекта.

  2. Пропустить проходит содержимое и конец контейнера и получает следующий токен. Его результат сохраняем в ЕстьТокен.

  3. Продолжить возвращает управление к условию цикла без дополнительного Прочитать: иначе потеряли бы имя следующего поля.

  4. В quantity проверяем числовой токен и фиксированный итог; вложенное диагностическое 999 не принимается за количество товара.

Как проверить результат

  1. Результат 3, пропущена ровно одна диагностика; 999 не является итоговым количеством.

  2. Добавьте в trace ещё вложенный объект: Пропустить по-прежнему обходит debug целиком.

  3. Замените корневое quantity на строку "3": проверка числового типа отклоняет ввод.

Ожидаемый результат

Корректно обработан токен сразу после пропущенного объекта на заданном учебном контракте.

На что обратить внимание

  1. Это не универсальный валидатор JSON: для произвольных неизвестных контейнеров надо явно вести уровень вложенности.

  2. Пропуск чтения не отменяет ограничений размера внешнего ответа и не заменяет проверку допустимых полей.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

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

Не загружаем структуру целиком: последовательно читаем токены и считаем имена свойств. Null, число и строка различаются по типу токена.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Все исходные JSON-строки и значения заданы в коде. Файлы, токены доступа, интернет и рабочая база не нужны.

  2. Не подставляйте в упражнения ответы реального API с персональными данными. Сначала проверяйте неизменённый учебный набор.


Текст = "{""name"":""Книга"",""quantity"":3,""enabled"":true,""tags"":[""paper""],""note"":null}";
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Текст);
ЧислоИмен = 0;
Попытка
    Пока Чтение.Прочитать() Цикл
        Сообщить(СтрШаблон("Строка %1; позиция %2; тип %3; значение %4",
            Чтение.ТекущаяСтрока, Чтение.ТекущаяПозиция,
            Чтение.ТипТекущегоЗначения, Чтение.ТекущееЗначение));
        Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
            ЧислоИмен = ЧислоИмен + 1;
        КонецЕсли;
    КонецЦикла;
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ЧислоИмен <> 5 Тогда
    ВызватьИсключение "В учебном объекте ожидалось пять имён свойств";
КонецЕсли;
Сообщить(ЧислоИмен);

Разбор по шагам

  1. Прочитать перемещает состояние на очередной JSON-токен; Ложь означает конец входа.

  2. Имя свойства и его значение — разные токены. Начало и конец массива/объекта тоже встречаются при чтении.

  3. ТипТекущегоЗначения отличает строку от числа, даже если отображаемые тексты похожи.

  4. ТекущаяСтрока и ТекущаяПозиция помогают ориентироваться в документе. Это не индекс элемента массива данных.

Как проверить результат

  1. Подсчитано 5 имён: name, quantity, enabled, tags, note.

  2. Для quantity значение числовое 3; для элемента tags значение строковое paper.

  3. Перенесите свойства на разные строки корректного JSON: содержимое не меняется, номера текущих строк меняются.

Ожидаемый результат

Получена карта последовательности токенов и мест в исходном тексте для изучения потокового JSON API.

На что обратить внимание

  1. ТекущееЗначение не следует читать как готовый объект или массив в момент токена начала контейнера.

  2. Позиции относятся к тексту JSON, не к байтам UTF-8 на диске. Не используйте их как файловые смещения.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.