Вы получаете нарушение прав доступа, потому что используете TJSONObject
неправильно.
Все значения JSON, которые вы пытаетесь прочитать, не являются непосредственными потомками объекта верхнего уровня JSON иерархия, где вы ожидаете, поэтому GetValue()
возвращает указатель nil
, а затем ваш код падает, когда он пытается прочитать свойство Value
, используя этот указатель nil
.
Значения, которые вы хотите На несколько уровней глубже в иерархии JSON. Объект верхнего уровня содержит дочерний элемент с именем countrydata
, который является массивом объектов. Значения, которые вы хотите, являются потомками первого объекта в этом массиве.
Попробуйте вместо этого:
procedure TForm1.Button2Click(Sender: TObject);
var
jsonRoot: TJSONValue;
jsonObj: TJSONObject;
jsonArr: TJSONArray;
tokenRequest: TRESTRequest;
tokenResponse: TRESTResponse;
tokenClient: TRESTClient;
begin
tokenClient := TRESTClient.Create(nil);
try
tokenClient.BaseURL := 'https://api.thevirustracker.com/free-api?countryTotal=PK';
tokenRequest := TRESTRequest.Create(tokenClient);
tokenRequest.Client := tokenClient;
tokenResponse := TRESTResponse.Create(tokenClient);
tokenRequest.Response := tokenResponse;
tokenRequest.Execute;
jsonRoot := TJSONObject.ParseJSONValue(tokenResponse.JSONText);
try
jsonObj := jsonRoot as TJSONObject;
jsonArr := jsonObj.GetValue('countrydata') as TJSONArray;
jsonObj := jsonArr.Items[0] as TJSONObject;
Memo1.Lines.Add('TotalCases => ' + jsonObj.GetValue('total_cases').Value);
Memo1.Lines.Add('TotalRecovered=> ' + jsonObj.GetValue('total_recovered').Value);
Memo1.Lines.Add('TotalDeaths=> ' + jsonObj.GetValue('total_deaths').Value);
Memo1.Lines.Add('TotoalNewCases=> ' + jsonObj.GetValue('total_new_cases_today').Value);
finally
jsonRoot.Free;
end;
finally
tokenClient.Free;
end;
end;
В качестве альтернативы, вы можете использовать TRESTResponse.RootElement
и TRESTResponse.JSONValue
свойства вместо вызова TJSONObject.ParseJSONValue()
вручную:
procedure TForm1.Button2Click(Sender: TObject);
var
jsonObj: TJSONObject;
jsonArr: TJSONArray;
tokenRequest: TRESTRequest;
tokenResponse: TRESTResponse;
tokenClient: TRESTClient;
begin
tokenClient := TRESTClient.Create(nil);
try
tokenClient.BaseURL := 'https://api.thevirustracker.com/free-api?countryTotal=PK';
tokenRequest := TRESTRequest.Create(tokenClient);
tokenRequest.Client := tokenClient;
tokenResponse := TRESTResponse.Create(tokenClient);
tokenRequest.Response := tokenResponse;
tokenResponse.RootElement := 'countrydata';
tokenRequest.Execute;
jsonArr := tokenResponse.JSONValue as TJSONArray;
jsonObj := jsonArr.Items[0] as TJSONObject;
Memo1.Lines.Add('TotalCases => ' + jsonObj.GetValue('total_cases').Value);
Memo1.Lines.Add('TotalRecovered=> ' + jsonObj.GetValue('total_recovered').Value);
Memo1.Lines.Add('TotalDeaths=> ' + jsonObj.GetValue('total_deaths').Value);
Memo1.Lines.Add('TotoalNewCases=> ' + jsonObj.GetValue('total_new_cases_today').Value);
finally
tokenClient.Free;
end;
end;