让我重新说出我的问题。我需要解析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);如果它遗失了其他的将不起作用。
答案 0 :(得分: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
注意上面的代码只是一个三元运算符(short-hand if / then语句)。这里有关于三元运算符的文档:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Conditional_Operator
答案 1 :(得分:0)
我很困惑...我仍然无法针对“”或null或未定义测试返回的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
: '';