![]()  | 
	
 
  | 
| 
	 | 
| 
		 
			 
			#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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Отлично, мысль понял, спасибо! 
		
	
		
		
		
		
		
	
		
		
	
	
	 |