【问题标题】:Parse Firebase JSON array解析 Firebase JSON 数组
【发布时间】:2021-11-23 07:48:50
【问题描述】:

我需要解析来自 Firebase 数据库的以下 JSON 响应。在此 JSON 示例中,有 2 个文档 qouap915p3vl。两个文档都有多个字段。我想将每个文档中所有字段的字符串合并到一行。

{
  "documents": [
    {
      "name": "projects/..",
      "fields": {
        "qouap9": {
          "stringValue": "A1:Hello;"
        },
        "5": {
          "stringValue": "A9:..."
        },
        "6": {
          "stringValue": "A10:..."
        }
      },
      "createTime": "2020-08-08T20:44:2",
      "updateTime": "2020-08-08T20:44:3"
    },
    {
      "name": "projects/..",
      "fields": {
        "15p3vl": {
          "stringValue": "A2:2020;"
        },
        "2": {
          "stringValue": "A6:..."
        },
        "t0w4yj": {
          "stringValue": "A4:2020;"
        },
        "1": {
          "stringValue": "A5:..."
        }
      },
      "createTime": "2020-10-20T06:58:2",
      "updateTime": "2020-10-20T06:58:2"
    }
  ]
}

我希望结果是这样的:

A1:Hello; A9:... A10:...

A2:2020; A6:... A4:2020; A5:...

【问题讨论】:

  • 您能否提供一个示例,说明您希望结果看起来像什么?
  • 我已经更新了@RemyLebeau 的帖子
  • 这不是我要求的。您希望 结果字符串 看起来像什么?你在寻找类似'A1:Hello; A9:... A10:... A2:2020; A6:... A4:2020; A5:...' 的东西吗?还是只是'A1:Hello; A2:2020;'?或者是其他东西?请更具体。不管怎样,你看过Delphi内置的JSON frameworks了吗?
  • 我的错。再次更新了代码。不幸的是,我从未使用过 JSON 框架。 @RemyLebeau
  • 你想要的结果还不清楚。 A9:... A10:...documents[0] 的字段,但跳过了 qouap9 字段。 A2:2020; A6:... A4:2020; A5:...documents[1] 的所有字段,但不会跳过15p3vl 字段。那么,为什么第一个结果会跳过一个字段?或者,您的意思是 A1:Hello; A9:... A10:... 吗?

标签: json delphi delphi-10.3-rio


【解决方案1】:

由于上次解释不够,这里再试一次。

implementation

uses
  System.JSON;

procedure DoSomeJSONStuff(const jsonstr: string);
var
  jo, fields: TJSONObject;
  ja: TJSONArray;
  jv: TJSONValue;
  i: integer;
  desiredstr: string;
begin

  // 1.
  jo := TJSONObject.ParseJSONValue(jsonstr) as TJSONObject;
  if (jo <> nil) then begin
    try

      // 2.
      ja := jo.GetValue('documents') as TJSONArray;

      // 3.
      for jv in ja do begin
        fields := (jv as TJSONObject).GetValue('fields') as TJSONObject;
        desiredstr := '';

        // 4.
        for i := 0 to fields.Count - 1 do begin
          desiredstr := desiredstr + (fields.Pairs[i].JsonValue as TJSONObject).GetValue('stringValue').Value;
        end;
        ShowMessage(desiredstr);
      end;
    finally

      // 5.
      jo.Free;
    end;
  end;
end;
  1. jsonstr 是您的 JSON 作为字符串。使用TJSONObject.ParseJSONValue,您可以解析您的JSON 并在没有失败的情况下返回TJSONValue。否则值为nil,因此检查variable &lt;&gt; nil。由于TJSONObject 派生自TJSONValue,因此在这种情况下可以简单地显式转换。几乎所有内容都源自 Delphi JSON 框架中的TJSONValue。如果您想检查 TJSONValue 是否真的是您想要的 JSON 容器,您可以这样做:

    var
     jv: TJSONValue;
     jo: TJSONObject;
    begin
      jv := TJSONObject.ParseJSONValue(jsonstr);
      if jv is TJSONObject then begin
        jo := (jv as TJSONObject);
        // code here
      end else
        raise Exception.Create('Unexpected container - expected: TJSONObject');
    
  2. 下一步是在 JSON 中获取 documents。它的值是一个数组。如果您不确定结构,您可以使用TryGetValue 而不是GetValue。您可以再次检查返回的值是否实际上是 TJSONArrayvariable is TJSONArray。我假设你的结构总是一样的。

  3. 现在我们用一个简单的for in 循环遍历数组。

  4. 由于您的 fields 的元素名称没有“静态”名称,我们按计数遍历字段。我们得到TJSONValue 并将其转换为TJSONObject。对于TJSONObject,我们得到stringValues 和GetValue('stringValue').Value,并将其连接到desirestr 变量。

  5. 只要你只引用它,你只需要释放你的“主要”变量/容器。其他一切都只是Pointer

编辑#1:关于 nil 的提示。编辑#2:释放内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2021-11-21
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多