Пропустить вложенную диагностику и не потерять следующее поле

Учебные задачи

В 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. Пропуск чтения не отменяет ограничений размера внешнего ответа и не заменяет проверку допустимых полей.

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

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

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

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

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