如何使用 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
数组一样。无论如何,此示例应该适用于您的代码段。
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
或 json
和item
在第二个循环中。
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
。
那你要记住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()
)以防止异常。
我想从这个 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
数组一样。无论如何,此示例应该适用于您的代码段。
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
或 json
和item
在第二个循环中。
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
。
那你要记住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()
)以防止异常。