1

我想从这个 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 代码时,我的问题是,如何正确解析这个 json 以获取值username?谢谢你。

4

2 回答 2

2

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

超对象

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不是item2或。jsonitem

X-超对象

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;
于 2017-03-23T09:00:27.280 回答
0

免责声明:这个答案与SuperObject 相关。当时,给出了这个答案,不知道这个问题实际上是指XSuperObject


我什么都得不到

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

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

然后你必须记住,两者sections都是users数组。因此,您需要在嵌套迭代中迭代两个数组:

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())以防止异常。

于 2017-03-23T09:13:51.760 回答