Как проанализировать эти json данные в Delphi 10 Сиэтле? - PullRequest
0 голосов
/ 14 апреля 2020

У меня проблемы с анализом этих JSON данных в Delphi 10 Сиэтле. Я хочу получить значения из JSON и показать их в TLabel компонентах один за другим. Я новичок в JSON и REST, было бы неплохо, если бы вы предоставили рабочий пример.

{
  "countrydata":[
    {
      "info":{
        "ourid":119,
        "title":"Pakistan",
        "code":"PK",
        "source":"https://thevirustracker.com/pakistan-coronavirus-information-pk"
      },
      "total_cases":5038,
      "total_recovered":1026,
      "total_unresolved":0,
      "total_deaths":86,
      "total_new_cases_today":27,
      "total_new_deaths_today":0,
      "total_active_cases":3926,
      "total_serious_cases":37,
      "total_danger_rank":33
    }
  ],
  "stat":"ok"
}

EDIT Пока у меня есть этот код, но он дает ошибку нарушения доступа и не выводится. Что я делаю не так.

procedure TForm1.Button2Click(Sender: TObject);
 var
  jsonRoot: TJSONObject;
  tokenRequest: TRESTRequest;
  tokenResponse: TRESTResponse;
  tokenClient: TRESTClient;
begin
  tokenClient := TRESTClient.Create(nil);
  tokenRequest := TRESTRequest.Create(nil);
  tokenResponse := TRESTResponse.Create(nil);
  try
    tokenRequest.Client := tokenClient;
    tokenRequest.Response := tokenResponse;
    tokenClient.BaseURL := 'https://api.thevirustracker.com/free-api?countryTotal=PK';
    tokenRequest.Execute;
    jsonRoot:= TJSONObject.ParseJSONValue(tokenResponse.JSONText) as TJSONObject;
    Memo1.Lines.Add('TotalCases => ' + jsonRoot.GetValue('total_cases').Value);
    Memo1.Lines.Add('TotalRecovered=> ' + jsonRoot.GetValue('total_recovered').Value);
    Memo1.Lines.Add('TotalDeaths=> ' + jsonRoot.GetValue('total_deaths').Value);
    Memo1.Lines.Add('TotoalNewCases=> ' + jsonRoot.GetValue('total_new_cases_today').Value);
  finally
    tokenResponse.Free;
    tokenRequest.Free;
    tokenClient.Free;
  end;
end;

1 Ответ

0 голосов
/ 16 апреля 2020

Вы получаете нарушение прав доступа, потому что используете 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...