2013-01-10 44 views
1

讓我重新提出我的問題。我需要從Last.FM解析JSON數據。這個數據可以根據查找的成功而改變,這意味着我的JSONP節點可以不同於一個搜索到另一個搜索。問題是如果我查找一個不存在的節點,整個查找失敗,並且我將鬆散JSON對象中的所有數據。我不知道如何捕獲這種錯誤,並在錯誤發生後繼續遍歷JSON數據。如何在JSON數據中捕獲解析錯誤

/********** Last FM Scrobbler - get album JSON details ***********/ 

function refreshArtwork(artist, track) {  
$.ajax({ 
    type: 'GET', 
    url: 'http://ws.audioscrobbler.com/2.0/', 
    data: { 
     method: 'track.getInfo', 
     api_key: 'c88cc53549bec0e9f246f056dc05a745', 
     artist: artist, 
     track: track, 
     format: 'json', 
     }, 
    dataType: 'jsonp', //must be JSONP for CORS 
    error: lstError, 
    success: getLastfm 
    }); 
} 



/* success: parse album XML from LastFM scrobbler */ 
function getLastfm(json) { 

//alert(json.track.wiki.summary); // wiki summary 
var lstArtist = (json.track.artist['name']); // artist 
var lstTitle = (json.track.name); // Title 
var lstAlbumart = (json.track.album.image[3]['#text']);// 0=small, 1=medium, 2=large, 3=xlarge 
//var listWikis = (json.track.wiki.summary); // WIKI summary 
var lstAlbum = (json.track.album.title); // album 

// if no artist info then error in name 
if (lstArtist ===null) { 
    $('#response').append('<li style="color:red">' + 'No Artist Match on Last.FM!' + '</li>'); 
    lstError(); 
} 
// if no album art info then error in album URL 
if (lstAlbumart ===null) { 
    $('#response').append('<li style="color:red">' + 'No Album Art URL Match on Last.FM!' + '</li>'); 
    lstError(); 
} 

例如,如果JSON數據中缺少相冊標題,我無法進入任何其他節點。 lstTitle =(json.track.name);如果其他人失蹤不起作用。

回答

1

您可以使用typeof來檢查是否存在節點。

喜歡的東西:

var lstArtist = (typeof json.track.artist.name === "string") 
       ? json.track.artist.name 
       : ''; 

如果實際上並不存在這將設置lstArtist變量或者藝術家的名字或一個空字符串。

關於typeof的好處是它總是返回一個字符串,即使你正在檢查的內容不存在(在這種情況下它會返回字符串:「undefined」)。

退房一些文檔typeof這裏:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/typeof

注意上面的代碼僅僅是一個三元運算符(短手的if/then語句)。這裏的文件爲三元運營商:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Conditional_Operator

+0

感謝看起來像我一直在尋找...如何測試一個節點,看看它之前,它打破了整個JSON我認爲我是在一個趕上22時刻! – hillcreative

0

我感到困惑...我仍然無法測試返回的JSON值對「」或null或未定義沒有成功。只要其中一個節點不是JSON對象的一部分,所有的數據都不會被返回。挑戰在於JSON將根據搜索結果而改變。

/********** Last FM Scrobbler - get album JSON details ***********/ 

function refreshArtwork(artist, track) {  
$.ajax({ 
    type: 'GET', 
    url: 'http://ws.audioscrobbler.com/2.0/', 
    data: { 
     method: 'track.getInfo', 
     api_key: 'c88cc53549bec0e9f246f056dc05a745', 
     artist: artist, 
     track: track, 
     format: 'json', 
     }, 
    dataType: 'jsonp', //must be JSONP for CORS 
    error: lstError, 
    success: getLastfm 
    }); 
} 



/* success: parse album XML from LastFM scrobbler */ 
function getLastfm(json) { 

//alert(json.track.wiki.summary); // wiki summary 
var lstError = (typeof json.error === "string") 
      ? json.error 
      : ''; 

var lstArtist = (typeof json.track.artist.name === "string") 
      ? json.track.artist.name 
      : ''; 
var lstTitle = (typeof json.track.name === "string") 
      ? json.track.name 
      : ''; 
var lstAlbumart = (typeof json.track.album.image[3]['#text'] === "string") 
      ? json.track.album.image[3]['#text'] 
      : ''; 
var lstAlbum = (typeof json.track.album.title === "string") 
      ? json.track.album.title 
      : ''; 
var lstWikis = (typeof json.track.wiki.summary === "string") 
      ? json.track.wiki.summary 
      : ''; 
+0

邏輯檢查你在說什麼?我只看到變量聲明。 – Jasper