我有一个回调函数,当我从YQL语句返回时执行:
function cbfunc(json)
{
if (json.query.count)
{
var data = json.query.results.json;
$("#output").append(data.raw[0]["176932931"].name);
}
这是我正在使用的JSON对象: http://www.easports.com/iframe/fifa14proclubs/api/platforms/PS4/clubs/51694/members
我正在获取json的结果并将其分配给 data 变量。但是,当我尝试访问数据变量(data.raw [0] [“176932931”]。name)时,它给出了以下错误:data.raw [0]未定义。
这是我在console.log(json)时返回的内容: http://i.imgur.com/mvYMYYI.png
这是我在console.log(data)时返回的内容; http://i.imgur.com/fxBqvSJ.png
HOWEVER ,当我将JSON字符串直接分配给数据变量时,它可以正常工作,并且我能够访问对象的属性而没有错误:
var data = {"raw":[{"176932931":{"name":"Shipdawg","blazeId":176932931,"clubStatus":0,"onlineStatus":0,"nucleusId":2266699357,"personaName":"Shipdawg"},"182141183":{"name":"Beks8","blazeId":182141183,"clubStatus":0,"onlineStatus":0,"nucleusId":2272736228,"personaName":"Beks8"},"219929617":{"name":"ChelseaFC_26","blazeId":219929617,"clubStatus":0,"onlineStatus":0,"nucleusId":2304510098,"personaName":"ChelseaFC_26"},"457588267":{"name":"Lazy__Rich","blazeId":457588267,"clubStatus":0,"onlineStatus":0,"nucleusId":2495578386,"personaName":"Lazy__Rich"},"517570695":{"name":"x0__andrew__0x","blazeId":517570695,"clubStatus":0,"onlineStatus":1,"nucleusId":2549150176,"personaName":"x0__andrew__0x"},"912396727":{"name":"mizz00-","blazeId":912396727,"clubStatus":0,"onlineStatus":1,"nucleusId":1000118566560,"personaName":"mizz00-"},"915144354":{"name":"MisterKanii","blazeId":915144354,"clubStatus":2,"onlineStatus":0,"nucleusId":2281969661,"personaName":"MisterKanii"}}]};
通过此更改,我在console.log(数据)时会得到一个稍微不同的对象: http://i.imgur.com/VNCcwmx.png
但我不能将其用作解决方案,因为根据我的YQL语句,数据变量会有所不同。
所以问题是,我是如何访问第一个对象的属性的呢?这个: http://i.imgur.com/fxBqvSJ.png
我看了SO和谷歌,我似乎无法找到解决方案。
感谢。
答案 0 :(得分:1)
您从第一个链接返回的JSON对象似乎与您的console.log
语句中显示的内容不同。
具体来说,在EASports的示例中,raw
属性是一个包含JSON对象的长度为1的数组,但您似乎要处理的只是JSON对象本身。
为了让您现有的代码正常工作,您可以执行以下操作:
$("#output").append(data.raw["_12396727"].name);
从更一般的意义上讲,使用@Neversay提出的Object.keys将允许您迭代data.raw
中包含的结果。因此,要访问底层JSON对象文字,您可以使用类似:
var keys = Object.keys(data.raw);
for(var i = 0; i < keys.length; i++) {
var obj = data.raw[keys[i]];
console.log(obj.name);
}
答案 1 :(得分:0)
尝试Object.keys:
var key0 = Object.keys(data.raw)[0];
var name = data.raw[key0].name; ......
答案 2 :(得分:0)
兴趣,EAsport的结果是一个包含一个对象的列表。但是在被YQL处理之后,raw变成了一个对象,而不再是一个箭头......