2013-11-24 105 views
0

如何使用jQuery訪問此JSON數組?我當前處理的陣列從API到console.log()其中顯示以這種格式閱讀解析的JSON響應

Object {already_liked: false, media_id: "1234567890", likeResult: Object} 
    already_liked: false 
    likeResult: Object 
     data: null 
     meta: Object 
      code: 200 
      __proto__: Object 
     __proto__: Object 
    media_id: "1234567890" 
    __proto__: Object 

我正在從一個AJAX請求此響應其以這樣的方式

$.get('/likemedia', { 
    mediaid: $(this).data("id") 
}, function(data){ 
    console.log(data.html); 
}, 'json'); 

響應格式化從/likemedia以這樣的方式被格式化

{"html":{"already_liked":false,"media_id":"1234567890","likeResult":{"meta":{"code":200},"data":null}}} 

然後我試圖acessing的JSON數組鍵「元[‘代碼’]」使用這種格式

data.html.likeResult.meta.code 

這是現在可用,我怎麼能得到'data.likeResult.meta.code'的值?

我試圖做這將導致它的陣列扔到console.log

if (data.html.likeResult.meta.code === "200") { 
    alert("200 META CODE!"); 
} else { 
    console.log(data.html); 
} 
+1

對不起,但是你粘貼在這裏的console.log語句的輸出沒有任何意義,它是不完整的。我們需要看到對象的結構,如果我們要進一步幫助你 –

+0

爲什麼'data.html'? –

+0

我已經提前並添加了更多的信息,爲什麼這可能是一個問題 – Curtis

回答

1

你在一個Number類型做一個類型和價值進行檢查,比較它與一個字符串。這將始終評估爲false。當你是這種類型時,類型和值檢查是我鼓勵並且大大改進的,但是當處理JSON時,我不會假設類型。相反,我倒是要麼寫:

if (data.html.likeResult.meta.code == 200) 

或去:

if (data.hasOwnProperty('html')) 
{ 
} 

要避免:

if (+(data.html.likeResult.meta.code) === 200)//explicitly coercing to number 

不管怎麼說,我還訪問許多嵌套屬性之前檢查對象訪問不存在的屬性時會出錯,這會終止整個腳本。
或許這個功能可以幫你:

function checkObject(obj, properties) 
{ 
    var i, data = obj; 
    for (i=0;i<properties.length;++i) 
    { 
     if (!data.hasOwnProperty(properties[i])) 
     { 
      return undefined; 
      //or throw {'Property: ' + properties[i] + ' not found' , i} 
     } 
     data = data[properties[i]]; 
    } 
    return data; 
} 

這提供了JSON對象更安全的方法,IMO。在你的情況下,你可以這樣稱呼這個函數:

var meta = checkObject(data, ['html','likeResult','meta','code']); 
if (!meta) 
{//one of the properties wasn't available, deal with that here 
} 
//all was well, so now: 
if (meta.code == 200) 
{//... 
} 
+0

*「在處理JSON時,我不會假設類型」*如果您正在使用適當的API,爲什麼不呢? –

+0

@FelixKling:有兩個原因:如果你不控制API,並且服務提供者決定爲JSON格式的數據使用不同的lib,並且lib只是盲目地引用所有內容(包括ints),那麼嚴格檢查將不會幫幫我。如果您控制API,那麼有可能它會與調用它的JS代碼一起開發,如果有人發現這個_meta_屬性可用於將其他意外數據(如日期)抽取到代碼中,那麼嚴格比較將會失敗。基本上,它是你沒有完全控制的數據,所以我會避免檢查嚴格,因爲JS允許你... –

+0

偉大的信息提供,非常感謝你 – Curtis

2

您正確地訪問數據下面,但是你在做對字符串的一些嚴格的比較。那總是false。嚴格比較意味着兩個值的數據類型必須匹配。所以,用一個數字來比較:

data.html.likeResult.meta.code === 200 

改爲。

你可以清楚地看到,code是一個數字,因爲該值不是在雙引號:

{"code":200}