如何在Delphi 10 Seattle中解析此json数据?

时间:2020-04-14 14:40:15

标签: json delphi

我在Delphi 10 Seattle中无法解析此JSON数据。我想从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"
}

编辑 到目前为止,我已经有了这段代码,但是它给出了访问冲突错误,并且没有给出输出。我在做什么错了。

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 :(得分:0)

由于使用不正确的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.RootElementTRESTResponse.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;