在 Delphi 中解析 JSON 数组

沃尔特·施拉迈尔

我有一个与Delphi 解析 JSON array 或 array类似的问题,但答案不符合我的需要。

我有这个 JSON:

[
  {
    "total": "9",
    "page": "9",
    "records": "99",
    "rows": [
      {
        "id": "62316",
        "titleId": "47243",
        "subject": [
          "000607",
          "000607_",
          "001727"
        ],
        "keyFeatures": [
          "AI",
          "URL"
        ]
      },
      {
        "id": "66",
        "titleId": "47243",
        "subject": [
          "000607",
          "000607_",
          "001727"
        ],
        "keyFeatures": [
          "KK"
        ]
      }
    ],
    "suggestion": "90"
  }
]

我想在备忘录中写下每个“id”的所有 fe“keyFeatures”,如下所示:

1: 62316 KeyFeatures: AI,URL 
2: 66 KeyFeatures: KK   
procedure TIFForm1.ParseJson(StrJson: string);
var
  LJsonArr: TJSONArray;
  LJsonArrRow: TJSONArray;
  vJSONObject: TJSONObject;
  vJSONPair: TJSONPair;
  vJSONObjectKF: TJSONObject;
  vJSONPairKF: TJSONPair;
  vJasonArrRows: TJSONArray;
  vJSONValue: TJSONValue;
  LJSONAttribute: String;
  LJSONKF_key: String;
  LJSONValue: String;
  i: integer;
begin
  LJsonArr := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StrJson), 0) as TJSONArray;
  if LJsonArr <> nil then
  try
    // rows
    vJasonArrRows := LJsonArr as TJSONArray;
    for vJSONValue in vJasonArrRows do
    begin
      i := i + 1;
      vJSONObject := vJSONValue as TJSONObject;
      vJSONPair := vJSONObject.get('id');
      LJSONAttribute := vJSONPair.JsonString.Value;
      vJSONValue := vJSONPair.JsonValue.Value;
      vJSONObjectKF := vJSONValue as TJSONObject;
      vJSONPairKF := vJSONObject.Get('keyFeatures');
      LJSONKF_key := vJSONPairKF.JsonString.Value;
      // How can I here merge all keyFeatures together with , separated?
      //Edit: My Serializer
      rowresult.KeyFeatures := serialize(vJSONObject, 'keyFeatures');
      Memo5.Lines.Add(Format('%d: %s KeyFeatures: %s', [i, rowresult.id, rowresult.keyFeatures]));
    end;
  finally
    LJsonArr.Free;
  end;
end;

此外,如果我可以询问 JSON 元素的类型,那会很方便。这是一个带有 keyFeatures 的示例,它也是一个 JSON 数组。但是可能还有更多未知的命名JSON键也是数组,这些也应该写在备忘录中。有解决办法吗?

编辑:我已经在 DP Answer 的帮助下以这种方式解决了这个问题,请看下面。

function TIFForm1.serialize(MyJSONObject: TJSONObject; keystring: string): string;
var
  KeyFeatures: TJSONValue;
  FeatureList: TStringList;
  FeatureItem: TJSONValue;
begin
  KeyFeatures := (MyJSONObject as TJSONObject).GetValue(keystring);
  if KeyFeatures is TJSONArray then
  begin
    FeatureList := TStringList.Create;
    try
      for FeatureItem in TJSONArray(KeyFeatures) do
        FeatureList.Add(FeatureItem.Value);
      Result := FeatureList.CommaText;
    finally
      FeatureList.Free;
    end;
  end
  else
  begin
    Result := KeyFeatures.Value;
  end;
end;
沃尔特·施拉迈尔

Delphipraxis DP 的一个好人提供了一个非常复杂的解决方案:

     procedure TForm1.Button1Click(Sender: TObject);
     var
       DataBase: String;
       JsonArray: TJSONArray;
       ArrayElement: TJSonValue;
       RowValue: TJSonValue;
       RowItem: TJSonValue;
       keyFeatures: TJSonValue;
       FeatureItem: TJSonValue;
       FeatureList: TStringlist;
       Id: Integer;
       Index: Integer;
     begin
       Memo1.Clear;
       DataBase :=
         '[{"total":"9","page":"9","records":"99","rows":[{"id":"62316","titleId":"47243","subject":'
         + '["000607","000607_","001727"],"keyFeatures":["AI","URL"]},{"id":"66","titleId":"47243","subject":'
         + '["000607","000607_","001727"],"keyFeatures":["KK"]}],"suggestion":"90"}]';

       JsonArray := TJSonObject.ParseJSONValue(DataBase) as TJSONArray;
       try
         Index := 1;
         for ArrayElement in JsonArray do
         begin
           RowValue := (ArrayElement as TJSonObject).GetValue('rows');
           if RowValue is TJSONArray
           then
           begin
             for RowItem in TJSONArray(RowValue) do
             begin
               RowItem.TryGetValue('id', Id);
               keyFeatures := (RowItem as TJSonObject).GetValue('keyFeatures');
               if keyFeatures is TJSONArray
               then
               begin
                 FeatureList := TStringlist.Create;
                 try
                   for FeatureItem in TJSONArray(keyFeatures) do
                     FeatureList.Add(FeatureItem.Value);
                   Memo1.Lines.Add(Format('%d: %d KeyFeatures: %s', [Index, Id, FeatureList.CommaText]));
                 finally
                   FeatureList.Free;
                 end;
               end;
             end;
           end;
           inc(Index);
         end;
       finally
         JsonArray.Free;
       end;
     end;

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章