1

让我重新表述我的问题。我需要从 Last.FM 解析 JSON 数据。此数据可能会根据查找的成功而改变,这意味着我的 JSONP 节点可能会因一次搜索而异。问题是如果我查找一个不存在的节点,整个查找将失败并且我丢失了 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); 如果它缺少其他人将无法正常工作。

4

2 回答 2

1

您可以使用它typeof来检查节点是否存在。

就像是:

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

这会将lstArtist变量设置为艺术家的姓名或空白字符串(如果实际不存在)。

最棒的typeof是它总是返回一个字符串,即使您正在检查的内容不存在(在这种情况下,它返回字符串:“undefined”)。

在这里查看一些文档typeofhttps ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/typeof

请注意,上面的代码只是一个三元运算符(简写 if/then 语句)。三元运算符的文档:https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Conditional_Operator

于 2013-01-10T18:18:08.233 回答
0

我很困惑......我仍然无法针对“”或 null 或 undefined 测试返回的 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 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
            : '';
于 2013-01-10T22:11:26.560 回答