无法从YQL语句访问JSON对象的属性

时间:2014-01-04 02:25:49

标签: javascript arrays json properties yql

我有一个回调函数,当我从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和谷歌,我似乎无法找到解决方案。

感谢。

3 个答案:

答案 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变成了一个对象,而不再是一个箭头......

相关问题