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" が返されます)。

ここのドキュメントをチェックして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

于 2013-01-10T18:18:08.233 に答える
0

私は困惑しています...返された JSON 値を "" または null または undefined に対してテストするのに引き続き問題がありますが、成功しません。ノードの 1 つが 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 に答える