|
#1
|
|||
|
|||
Как тут быть?
Приветствую друзья. Получаю 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 код:
Последний раз редактировалось pikabu, 09.04.2021 в 08:43. |
#2
|
|||
|
|||
предположим если значения attributes нет у записи, то заполнять пустой строчкой данный SubItems, но как?
|
#3
|
|||
|
|||
Зависит от того, как реагирует парсер на отсутствие переменнойи какие у него есть методы контроля. Проверять лень, так что пишу разные варианты.
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 := ''; Общая мысль. Если переменная не является обязательной, то при получении всегда проверяем наличие значения на каждом этапе разименования/получения значения (точка - это как раз эта операция). |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
pikabu (10.04.2021)
|
#4
|
|||
|
|||
Отлично, мысль понял, спасибо!
|