Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.04.2021, 08:36
pikabu pikabu вне форума
Прохожий
 
Регистрация: 27.12.2017
Сообщения: 30
Версия Delphi: 10.1
Репутация: 10
По умолчанию Как тут быть?

Приветствую друзья. Получаю json с сайта и парсив его, заполняю табличку (listview).

код:
Код:
procedure TfMain.DataToLw;
var
 I : Integer;
 json : TJSONObject;
 _rows : TJSONArray;
begin
  ListView1.Items.Clear;
  json := TJSONObject.ParseJSONValue(Utf8ToAnsi(MyData.DataString)) as TJSONObject;
  _rows := json.GetValue('rows') As TJSONArray;
  For I := 0 To _rows.Count-1 Do
    Begin
ProductName := (_rows.Items[i] As TJSonObject).Values['name'].Value;
ProductIdСode := (_rows.Items[i] As TJSonObject).Values['code'].Value;
ProductPrice := (((_rows.Items[i] As TJSonObject).Values['salePrices'] As TJSonArray).Items[1] As TJSonObject).Values['value'].Value;
ProductPrice:=copy(ProductPrice,1,length(ProductPrice)-2);
ProductEan13 := (((_rows.Items[i] As TJSonObject).Values['barcodes'] As TJSonArray).Items[0] As TJSonObject).Values['ean13'].Value;
ProductData := (((_rows.Items[i] As TJSonObject).Values['attributes'] As TJSonArray).Items[0] As TJSonObject).Values['value'].Value;
FillList;
End;
json.Free;
end;

Код:
procedure TfMain.FillList;
var
item: TListItem;
begin
        Item:=ListView1.Items.Add;
        Item.Caption:=IntToStr(ListView1.Items.Count);
        Item.SubItems.Add(ProductEan13);
        Item.SubItems.Add(ProductName);
        Item.SubItems.Add(ProductPrice);
        Item.SubItems.Add(ProductData);
        Item.SubItems.Add(ProductIdСode);
end;

Суть проблемы:
Если в получаемом json у одного объекта скажем отсутствует значение attributes
PHP код:
ProductData := (((_rows.Items[i] As TJSonObject).Values['attributes'] As TJSonArray).Items[0] As TJSonObject).Values['value'].Value
, но у других оно есть, то список в listview не загружается. Как можно это обойти и если значения нет, то все-равно заполнять listview?

Последний раз редактировалось pikabu, 09.04.2021 в 08:43.
Ответить с цитированием
  #2  
Старый 09.04.2021, 14:48
pikabu pikabu вне форума
Прохожий
 
Регистрация: 27.12.2017
Сообщения: 30
Версия Delphi: 10.1
Репутация: 10
Вопрос

предположим если значения attributes нет у записи, то заполнять пустой строчкой данный SubItems, но как?
Ответить с цитированием
  #3  
Старый 10.04.2021, 04:00
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия 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). Ну тут уже по аналогии сам напишешь.

Общая мысль. Если переменная не является обязательной, то при получении всегда проверяем наличие значения на каждом этапе разименования/получения значения (точка - это как раз эта операция).
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
pikabu (10.04.2021)
  #4  
Старый 10.04.2021, 10:22
pikabu pikabu вне форума
Прохожий
 
Регистрация: 27.12.2017
Сообщения: 30
Версия Delphi: 10.1
Репутация: 10
По умолчанию

Отлично, мысль понял, спасибо!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter