如何使用 X-SuperObject 访问 JSON 中的嵌套值

How to access nested values in JSON using X-SuperObject

我想从这个 json 中获取所有用户。

{
  "status": "ok",
  "next_max_id": "AQAmA1l9NAQXa",
  "sections": [
    {
      "module": null,
      "show_view_all": null,
      "title": null,
      "users": [
        {
          "pk": 48165888,
          "is_verified": false,
          "profile_pic_url": "http://scontent-sit4-1.cdninstagram.com/t51.2885-19/s150x150/17332306_1915592632007479a.jpg",
          "full_name": "Jason Giovany Castro Morales",
          "is_private": false,
          "has_anonymous_profile_picture": false,
          "username": "jasongiovanycastromorales",
          "profile_pic_id": "14699765111792881_48165888"
        }
      ]
    }
  ]
}

现在,我尝试获取所有用户名。

procedure TForm2.Button6Click(Sender: TObject);
var
  json : ISuperObject;
  node : ISuperObject;
  item : IMember;
begin
  try
    json := TSuperObject.Create(list.Text);

    for item in json['sections.users'].AsArray do
    begin
      node := item.AsObject;
      Memo4.Lines.Add(node.S['username']);
    end;
  finally
  end;
end;

第二次尝试..我得到了 AV!

var
    json         : ISuperObject;
    node         : ISuperObject;
    item, item2         : IMember;
  begin
     json := SO(list.Text);

   for item in json['sections'].AsArray do
    begin
       for item2 in json['users'].AsArray do
        begin
        node := item.AsObject;

        Memo1.Lines.Add(node.S['username']);
       end;
     end;
  end;

此 JSON 中有 200 个用户名值 当我尝试使用 json 代码时,我什么也没得到,有时是 AV,我的问题是,如何正确解析此 json 以获得值 username?谢谢。

你的例子有问题,你没有指定输入数据的格式,就像我不知道 sections 数组中的所有对象是否包含 users 数组一样。无论如何,此示例应该适用于您的代码段。

SuperObject

procedure TForm2.Button6Click(Sender: TObject);
var
  json, user, section : ISuperObject;
begin
  json := SO(list.Text);
  for section in json['sections'] do
  begin
    if Assigned(section['users']) then
    begin
      for user in section['users'] do
      begin
        if user.S['username'] <> '' then
          Memo4.Lines.Add(user.S['username']);
      end;
    end;
  end;
end;

编辑: 实际上,您使用的不是 SuperObject,而是 X-SuperObject,这是不同的。即使我从未使用过该库,我也只能通过他们网站上的示例找到问题,因为您犯了一些简单的错误,例如使用 item 而不是 item2jsonitem 在第二个循环中。

X-SuperObject

procedure TForm2.Button6Click(Sender: TObject);
var
  json : ISuperObject;
  item, item2 : IMember;
begin
  json := TSuperObject.Create(list.Text);
  for item in json['sections'].AsArray do
  begin
    for item2 in item.AsObject['users'].AsArray do
      Memo1.Lines.Add(item2.AsObject['username'].ToString);
  end;
end;

免责声明: 此答案涉及 SuperObject. At the time, this answer was given, it was unknown that the question actually refers to XSuperObject


I get nothing

这不太可能,因为您至少应该遇到访问冲突。这是因为,您没有以正确的方式创建超级对象。

我建议你使用工厂函数SO()而不是调用构造函数TSuperObject.Create

那你要记住sectionsusers都是数组。因此,您需要在嵌套迭代中迭代两个数组:

var
  json: ISuperObject;
  section: ISuperObject;
  user: ISuperObject;
begin
  json := SO(list.Text);
  for section in json['sections'] do // iterate sections
    for user in section['users'] do  // iterate users
      Memo4.Lines.Add(user.S['username']);
 end;

注意:这个例子是一个最小的方法。您应该添加进一步检查(例如 Assigned())以防止异常。