Delphi-JSON对象-如何在不知道属性名称的情况下迭代所有属性?

德扬·多泽特(Dejan Dozet)

我有一个相当简单的JSON:

[
    {
      "hero-img": "girl-ipad.png",
      "main-story-headline": "How to Stay Mentally Healthy During a Pandemic",
      "main-story-paragraph": "lorem ipsum",
      "main-story-button-text": "Read More"
    },
    {
      "hero-img": "painter-woman.png",
      "main-story-headline": "How to Stay Mentally Healthy During a Pandemic",
      "main-story-paragraph": "lorem ipsum",
      "main-story-button-text": "Explore More"
    },
    {
      "hero-img": "old-man.png",
      "main-story-headline": "How to Stay Mentally Healthy During a Pandemic",
      "main-story-paragraph": "lorem ipsum",
      "main-story-button-text": "Get Yours Now"
    } ]

通过使用Delphi 10.3 RIO,我想遍历所有属性,无论它们如何调用。我是这样开始的:

program JuTemplates;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.JSON, System.IOUtils, System.Types;

var
  root, OutputDir, TemplatesDir, JsonDir, jsonText: string;
  JsonFiles: TStringDynArray;
  i, j: Integer;
  JSONValue: TJSONObject;
  JSONValues: TJSONArray;
begin
  try

    try
      root := ExtractFilePath(ParamStr(0));
      OutputDir := root + 'OutputDir\';
      TemplatesDir := root + 'TemplatesDir\';
      JsonDir := root + 'JsonDir\';
      writeln('Processing: ' + JsonDir);
      JsonFiles := TDirectory.GetFiles(JsonDir);
      for i := 0  to High(JsonFiles) do
      begin
        jsonText := TFILE.ReadAllText(JsonFiles[i]);
        JSONValues := TJSONObject.ParseJSONValue(jsonText) as TJSONArray;

        for j := 0 to JSONValues.Count - 1 do
        begin
          JSONValue := JSONValues.Items[i] as TJSONObject;
          // here I should iterate through that JSONValue object
        end;
      end;
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    writeln ('Press any key to continue');
    readln;
  end;
end.
fpiette

要枚举JSONObject,可以使用如下枚举器。

用于for..in循环(隐式枚举器)

procedure TForm1.Button1Click(Sender: TObject);
var
   JSONData       : String;
   JSONObject     : TJSONObject;
   JSONPair       : TJSONPair;
begin
   JSONData   := '... some JSON data ...';   // Place you data here
   JSONObject := TJSonObject.ParseJSONValue(JSONData) as TJSONObject;
   try
     for JSONPair in JSONObject do
         ShowMessage(Format('1) Key=%s Value=%s',
                     [JSONPair.JsonString.ToString,
                      JSONPair.JsonValue.ToString]));
   finally
     JSONObject.Free;
   end;
end;

使用经典的for循环:

procedure TForm1.Button1Click(Sender: TObject);
var
   JSONData       : String;
   JSONObject     : TJSONObject;
   JSONPair       : TJSONPair;
   I              : Integer;
begin
   JSONData   := '... some JSON data ...';   // Place you data here
   JSONObject := TJSonObject.ParseJSONValue(JSONData) as TJSONObject;
   try
     for I := 0 to JSONObject.Count - 1 do begin
       ShowMessage(Format('Key=%s Value=%s',
                   [JSONObject.Pairs[I].JsonString.ToString,
                    JSONObject.Pairs[I].JsonValue.ToString]));
     end;
   finally
     JSONObject.Free;
   end;
end;

使用一个显式的枚举器和一个while循环:

procedure TForm1.Button1Click(Sender: TObject);
var
   JSONData       : String;
   JSONObject     : TJSONObject;
   JSONEnumerator : TJSONObject.TEnumerator;
   JSONPair       : TJSONPair;
begin
   JSONData   := '... some JSON data ...';   // Place you data here
   JSONObject := TJSonObject.ParseJSONValue(JSONData) as TJSONObject;
   try
     JSONEnumerator := JSONObject.GetEnumerator;
     try
       while JSONEnumerator.MoveNext do begin
         JSONPair := JSONEnumerator.Current;
         ShowMessage(Format('Key=%s Value=%s',
                     [JSONPair.JsonString.ToString,
                      JSONPair.JsonValue.ToString]));
       end;
     finally
       JSONEnumerator.Free;
     end;
   finally
     JSONObject.Free;
   end;
end;

请注意,您可能需要检查JSONPair.JsonValue是否具有子项,然后递归地用另一个枚举器枚举那些子项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不知道对象名称的情况下返回Json objects子对象?

在不知道这些属性名称的情况下访问对象的属性不起作用

如何在不知道对象名称的情况下访问对象

如何在不知道子类名称的情况下访问django中对象的子类?

如何在不知道我在 Python 中查找的对象名称的情况下解析 JSON 文件?

有没有办法在不知道该值的情况下按公共属性值对所有对象进行分组?

在 JSON 对象中,如何在不知道键的情况下检索 JSON 对象中对象的值?

如何在不知道名称的情况下获取JSONObject中的第一个对象?

如何在不知道名称的情况下访问打印为十六进制的环境中的对象

如何在不知道VB.NET中数字键名称的情况下从JSON获取值

如何在不知道匹配返回的 json 数据中的所有值的情况下从 .Net 核心中的 web api 调用创建模型?

如何使用Delphi正确释放JSON对象

如何在不知道键的情况下转换为接口对象?

如何在不知道索引的情况下从numpy数组中删除对象

如何在不知道T的情况下将对象转换为泛型类

如何在不知道分区键值的情况下从Cosmos DB中删除对象?

如何在不知道键的情况下提取对象每个值的返回类型

如何在不知道json键的情况下使用JsonReader从json读取值

如何在不知道JSON值的情况下动态解析某些JSON?

如何在不知道位置的情况下从嵌套的 json 返回特定的键值对?

如何在不知道键的情况下使用 javascript 从多级 JSON 中获取值

如何在不知道结构的情况下在 C# 中使 JSON 对象脱轨

一种在不知道嵌套 js 对象中的路径的情况下访问属性的方法

如何获取JavaScript对象的所有属性值(不知道键)?

如何获取Javascript嵌套对象的所有属性值(不知道键)?

如何在不知道元素的情况下循环所有XML属性

如何在不知道文件扩展名的情况下实例化java.io.File对象?

如何在不知道键的情况下基于键动态将嵌套的Json对象/数组转换为多个列表

在不知道名称的情况下扫描特定值的嵌套 json 响应