Показать сообщение отдельно
  #3  
Старый 10.04.2021, 04:00
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Зависит от того, как реагирует парсер на отсутствие переменнойи какие у него есть методы контроля. Проверять лень, так что пишу разные варианты.
1. Падает с эесепшеном. Тут надо смореть какие методы есть для проверки наличия переменной, типа ValueExists или IndexOf (возвр. -1 при отсутствии). Тогда вместо прямого получения сначала проверяем наличие, а потом уже получаем значение, типа:
Код:
if (((_rows.Items[i] As TJSonObject).Values.ValueExists('attributes') then
ProductData := (((_rows.Items[i] As TJSonObject).Values['attributes'] As TJSonArray).Items[0] As TJSonObject).Values['value'].Value
else
ProductData := '';
Ну и дальше заполняешь.
2. Если возвращает Nil, то надо это проверять, т.к. потом у тебя идет обращение к вложенному объекту и тут то все и падает:
Код:
if (_rows.Items[i] As TJSonObject).Values['attributes'] <> Nil Then
ProductData := (((_rows.Items[i] As TJSonObject).Values['attributes'] As TJSonArray).Items[0] As TJSonObject).Values['value'].Value
else
ProductData := '';
3. Все возвращается, но коллекция пустая (т.к. нет итемов). Действуем аналогично, только проверяем кол-во итемов в коллекции перед тем как получаит первый из них (т.е. с индексом 0). Ну тут уже по аналогии сам напишешь.

Общая мысль. Если переменная не является обязательной, то при получении всегда проверяем наличие значения на каждом этапе разименования/получения значения (точка - это как раз эта операция).
Ответить с цитированием