如何从 Delphi 中的 TRESTReponse 获取子项值?

BDu*_*rte 1 delphi response firemonkey

我需要获取包含以下 JSONsubitem1的 a 的值:LResponse

"Information": {
    "subitem1": "2011",
    "subitem2": "Test"
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码来获取其他值,它运行良好,但是当我尝试获取Information, subitem1or时subitem2,它返回一个空值。

var
  LClient: TRESTClient;
  LRequest: TRESTRequest;
  LResponse: TRESTResponse;
begin
  LClient := TRESTClient.Create(URL_API);
  try
    LRequest := TRESTRequest.Create(LClient);
    try
      LResponse := TRESTResponse.Create(LClient);
      try
        LRequest.Client := LClient;
        LRequest.Response := LResponse;
        LRequest.Method := rmGET;
        LRequest.Params.AddHeader('Authorization','Bearer '+FToken);
        LRequest.Params.ParameterByName('Authorization').Options := [poDoNotEncode];
        LRequest.Params.AddHeader('Accept', 'application/json');
        LRequest.Execute;

        LResponse.GetSimpleValue('subitem1', FLogradouro);
        { ... }
Run Code Online (Sandbox Code Playgroud)

Pet*_*olf 5

GetSimpleValue只能读取响应中 JSON 的顶级属性。它的效率也非常低,因为它在每次调用该方法时都会解析 JSON。

TRESTResponse已经允许您通过其JSONValue属性访问已解析的 JSON。它允许您使用 JSON 路径查询整个结构中的值。访问JSONValue属性只会解析一次响应,但请注意,如果响应为空或不是有效的 JSON,它可能会返回 nil。

另一点是你不必TRestResponse自己创建。它是在 中自动创建的LRequest.Execute。也就是说,访问返回的 JSON 中的值的代码将是:

if not Assigned(LRequest.Response.JSONValue) then
  raise Exception.Create('Invalid response.');
ShowMessage(LRequest.Response.JSONValue.GetValue<string>('Information.subitem1'));
Run Code Online (Sandbox Code Playgroud)

您可以在 JSON 路径中使用方括号作为数组访问器来按索引访问项目:

LRequest.Response.JSONValue.GetValue<string>('SomeStrings[0]');
Run Code Online (Sandbox Code Playgroud)