2013-12-12 94 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]); 
}