2013-12-12 66 views
3

我挣扎在这个网址一个JSON检索某个值:检索无名JSON数组url值

http://go-gadget.googlecode.com/svn/trunk/test.json

URL数据是这样的:

[ 
{ 
    "key":{ 
     "parentKey":{ 
      "kind":"user", 
      "id":0, 
      "name":"test 1" 
     }, 
     "kind":"smsgateway", 
     "id":5707702298738688 
    }, 
    "propertyMap":{ 
     "content":"test1 content", 
     "date":"Dec 12, 2013 2:58:57 PM", 
     "user":"test1" 
    } 
}] 

通过忽略“键”,我想使用JavaScript代码访问“propertyMap”对象(内容,日期和用户)的值。 我曾尝试这个代码,但它无法得到结果:

var url = "http://go-gadget.googlecode.com/svn/trunk/test.json"; 
$.getJSON(url, function (json) { 
for (var i = 0; i < json.length; i = i + 1) { 
    var content = json[i].propertyMap.content; 
    console.log('content : ', content); 
    var user = json[i].propertyMap.user; 
    console.log('user: ', user); 
    var date = json[i].propertyMap.date; 
    console.log('date : ', date); 
    } 
    }); 

(这里http://jsfiddle.net/KkWdN/不成功的代码)

考虑这个JSON不能改变,有没有我从没有犯错上面的代码还有其他技术可以获得结果吗?

我只是学习使用JavaScript和JSON 1个月,所以真的很感激。

--edited:我改变[]。长度到json.length,现在我正在寻找的答案访问URL

+0

'[]'创建一个空的阵列和'[] .length'得到空数组的长度,这当然如果'0'。 –

+0

不,由于相同的原产地政策,不可能。您将不得不使用服务器或其他服务器作为代理来检索json。 –

回答

1

这将是这样的:

$.getJSON("http://go-gadget.googlecode.com/svn/trunk/test.json", function(json) { 
    for (var i = 0; i < json.length; i++) { 
     var map  = json[i].propertyMap; 
     var content = map.content; 
     var user = map.user; 
     var date = map.date; 

     $('#date').text(date); 
     $('#nohp').text(user); 
     $('#content').text(content); 
    } 
}); 

但请求失败,因为没有“访问控制允许来源”标头出现在所请求的资源,所以你由同源策略

+0

谢谢你的答案,它真的帮助我。你能建议一下这样我可以访问请求吗? – sabrina

+0

你不能,它是一个json文件,而不是一个服务,所以它不能真正支持jsonp或CORS,所以你唯一的选择是使用像PHP这样的服务器端语言来获取数据。 – adeneo

+0

我有另一个json [这里](http://1.handy-post-402.appspot.com/show),格式看起来像我之前解释的。可以访问吗? – sabrina

1

你怎么想停止[] .length;将评估。

它是0,所以它永远不会进入for循环。

除此之外,你的代码看起来没问题。

更换你的for循环如下

$.getJSON(url, function (json) { 
    for (var i = 0; i < json.length; i = i + 1) { 

而且你似乎访问API为不同域的一部分。 所以你需要使用CORSJSONP得到这个工作,如果你想从不同的领域检索数据。

+0

所以这就是为什么我永远不会去的网址。你能提出一些使用jsonp的例子吗?谢谢你:) – sabrina

+0

@sabrina:JSONP也必须得到服务器的支持。 –

0

变化:

for (var i = 0; i < [].length; i = i + 1) { 

for (var i = 0; i < json.length; i = i + 1) { 

DEMO here.

0

如何使用类似以下 在你的情况,说对象是MyObj中,我会得到这样的价值此

var content = fetchValue(myObj, [0, "propertyMap", "content"], ""); 
var date = fetchValue(myObj, [0, "propertyMap", "date"], new Date()); 
var user = fetchValue(myObj, [0, "propertyMap", "user"], ""); 

只是为了确保我们发送一个默认值,以防我们没有得到所需的ojbect。这种方法的优点是,现在你不必担心嵌套在结构中的数组或对象。 fetchValue函数可能如下所示。

function fetchValue(object, propertyChain, defaultValue){ 
    var returnValue; 
    try{ 
     returnValue = object; 
     forEach(propertyChain, function(element){ 
      returnValue = returnValue[element]; 
     }); 
    }catch(err){ 
     return defaultValue; 
    } 
    if(returnValue == undefined) { 
     returnValue = defaultValue; 
    } 
    return returnValue; 
} 

添加在foreach功能

function forEach(array, action){ 
    for(var x in array) 
     action(array[x]); 
}