如何解析 Delphi 中的嵌套 TJSONObject?

How can I parse a nested TJSONObject in Delphi?

我的 Delphi 应用程序调用 REST API,它产生以下 JSON:

{
   "status": "success",
   "message": "More details",
   "data": {
      "filestring": "long string with data",
      "correct": [
         {
            "record": "Lorem ipsum",
            "code": 0,
            "errors": []
         }
      ],
      "incorrect": [
         {
            "record": "Lorem ipsum",
            "code": 2,
            "errors": [
               "First error",
               "Second error"
            ]
         }
      ],
   }
}

我现在想处理这些数据,但我无法接收存储在 data 部分中的信息。目前我正在尝试接收如下数据:

var
   vResponse : TJSONObject;
   vData : TJSONObject;
begin
   // .. do other stuff ..
   vResponse := // call to REST API (Returns a valid TJSONObject I've wrote it into a file)
   vData := vResponse.get('data'); // throws error
end;

但这会导致以下错误:

Incompatible Types: TJSONObject and TJSONPair

有人知道我怎样才能做到这一点吗?

Incompatible Types: TJSONObject and TJSONPair

错误信息不言自明:vData被声明为TJSONObject,这意味着Get函数的return类型是TJSONPair .

要修复此类错误,您需要更改结果变量的声明。在这种情况下,这意味着将 vData 声明为 TJSONPair.

但是,如果您对获得一双不感兴趣,而是 TJSONObject,则需要使用其他方式来取回它。例如 Values 属性。因为 Values returns TJSONValue 如果您知道该值是一个对象,则需要将其类型转换为 TJSONObject

vData := vResponse.Values['data'] as TJSONObject;

TJSONObject.Get()returns一个TJSONPair,不是一个TJSONObject。您将必须:

  • 使用 TJSONPair.JsonValue 属性:

    var
      vResponse : TJSONObject;
     vData : TJSONObject;
    begin
      // .. do other stuff ..
      vResponse := // call to REST API (Returns a valid TJSONObject I've wrote it into a file)
      vData := vResponse.Get('data').JsonValue as TJSONObject;
    end;
    
  • 使用TJSONObject.GetValue()方法,returns只是找到TJSONPair:

    JsonValue
    var
      vResponse : TJSONObject;
      vData : TJSONObject;
    begin
      // .. do other stuff ..
      vResponse := // call to REST API (Returns a valid TJSONObject I've wrote it into a file)
      vData := vResponse.GetValue('data') as TJSONObject;
    end;