0

从此 JSON(摘自完整示例):

{"sections":
  [
    {"layout_type":"media_grid"
    ,"layout_content":
      {"medias":
        [
          {"media":
            {"taken_at":1618071166
            ,"pk":2548887321653297579
            ...
            ,"user":
              {"pk":20416852171
              ,"username":"_artin.53"
              ...

我尝试提取的值username

var
  json, node : ISuperObject;
  item,item2: IMember;

...
json := TSuperObject.Create(xs.Text);    // Server response
for item in json['sections'].AsArray do
begin
  for item2 in item.AsObject['medias'].AsArray  do
  begin
    u := item2.AsObject['username'].ToString;
    TThread.Synchronize (TThread.CurrentThread,
      procedure ()
      begin
        Memo1.Lines.Add(u);
      end);
  end;
end;

我收到此代码的访问冲突。使用 Delphi 10.4 和 X-SuperObject 最新版本。

4

1 回答 1

2

逐步查看 JSON 数据并将其与您所做的进行比较:

  • ✓ 属性sections是一个数组
  • ✓ 其中的每个项目都是一个对象
  • 它的属性layout_content是一个对象
  • ✓ 它的属性medias是一个数组
  • ✓ 其中的每个项目都是一个对象
  • 它的属性media是一个对象
  • 它的属性user是一个对象
  • ✓ 它的属性username由文本组成

您的访问冲突应该发生在尝试访问item.AsObject['medias']当时不存在的访问时,包括nil并且因此没有任何具有方法的对象.AsArray()。所有这一切的发生都是因为你已经错过了一个级别,并且稍后你还需要完成另外两个级别。

您可以查看您想要的路径(即sections[]/layout_content/medias[]/media/user/username),而您的代码仅假定sections[]/medias[]/username.

于 2021-06-01T07:57:36.027 回答