简体   繁体   中英

$.getJSON not returning anything despite success

I'm relatively new to the whole jQuery thing, so apologies if this is a really obvious thing.

My basic problem is that the URL within the .getJSON() function is not returning anything despite the JSON file being valid.

jQuery:

$(document).ready(function() {
  var key = '*****************'

  var getMusic = function() {
      $.getJSON('http://developer.echonest.com/api/v4/song/search?api_key=' + key + '&artist=led+zeppelin', function(data) {
          $('.songs').append('<li>success</li>');
          data['songs'].forEach(function(d) {
              $('.songs').append('<li>' + d['title'] + '</li>');
          });
      });
  };

  $('.click').click(getMusic);
});

So the "success" gets appended to the list, but nothing else does. The debug console in Chrome gives me the following error: Uncaught TypeError: Cannot read property 'forEach' of undefined

I'm assuming this means that the URL is not passing anything to the function. But the URL is valid. If I just type it into Chrome, I get the following response.

{  
  "response":{  
  "status":{  
     "version":"4.2",
     "code":0,
     "message":"Success"
  },
  "songs":[  
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOWOYIL14EEE38DB16",
        "artist_name":"Led Zeppelin",
        "title":"St. Tristan's Sword (Rough Mix)"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOWTZWK12A6D4FC7A8",
        "artist_name":"Led Zeppelin",
        "title":"Rock And Roll - 2007 Remastered Version Live Version From The Song Remains The Same"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOWYEOY14EEE39630C",
        "artist_name":"Led Zeppelin",
        "title":"Bring It On Home (Rough Mix)"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOXAPFT12AF72A0776",
        "artist_name":"Led Zeppelin",
        "title":"The Ocean (Live Album Version)"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOTYJLS12A8C13B4A9",
        "artist_name":"Led Zeppelin",
        "title":"Somethin' Else - \"Tasty Pop Sundae\" Live Version From BBC Sessions"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOUQMIU12B0B8083DF",
        "artist_name":"Led Zeppelin",
        "title":"1-06 For Your Life"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOUKOUX12B0B80B0BA",
        "artist_name":"Led Zeppelin",
        "title":"308 - The Song Remains The Same"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOXXFOR12A8C13A5C6",
        "artist_name":"Led Zeppelin",
        "title":"Whole Lotta Love - \"Top Gear\" Live Version From BBC Sessions"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOXHHNN14DB525B914",
        "artist_name":"Led Zeppelin",
        "title":"Heartbreaker (For Voice)"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOXWXGG12B0B80B0AF",
        "artist_name":"Led Zeppelin",
        "title":"1-07 Trampled Underfoot"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOXWUUS12B0B80B0D9",
        "artist_name":"Led Zeppelin",
        "title":"412 - Moby Dick -- Bonzo's Montreux"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOXVXFK12B0B80B0C2",
        "artist_name":"Led Zeppelin",
        "title":"02 Going to California"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOXZGKC12A8C13B4C9",
        "artist_name":"Led Zeppelin",
        "title":"Heartbreaker - \"In Concert\" Live Version From BBC Sessions"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOXEDBF14EC9C340F9",
        "artist_name":"Led Zeppelin",
        "title":"10 Ribs & All/Carrot Pod Pod (Pod) (Reference Mix)"
     },
     {  
        "artist_id":"ARDIBRT1187B9AF176",
        "id":"SOYIZYO12C106D04DB",
        "artist_name":"Led Zeppelin",
        "title":"Ramble On (1999 Star System Mix)"
     }
    ]
   }
  }

I'm not sure why the code isn't performing as expected.

You are accessing wrongly the data from $.getJSON You need to get response first:

data.response['songs']

$(document).ready(function() {
  var key = '*****************'

  var getMusic = function() {
      $.getJSON('http://developer.echonest.com/api/v4/song/search?api_key=' + key + '&artist=led+zeppelin', function(data) {
          $('.songs').append('<li>success</li>');
          data.response['songs'].forEach(function(d) {
              $('.songs').append('<li>' + d['title'] + '</li>');
          });
      });
  };

  $('.click').click(getMusic);
});

Notice that data is the root JSON object, which has a response property. songs is in the response property, so in order to access it, you have to access data.response.songs

The correct code would be:

data.response.songs.forEach(function (song) {
    $('.songs').append('<li>' + song.title + '</li>');
});

If you must use JSONP

According to @Pointy's comment, it seems that you should use JSONP due to security reasons (possibly because of cross domain issues).

In order to use JSONP, you must provide a callback function appending &callback=? to the end of your service endpoint. (jQuery will send the appropiate callback value when sendng the request)

// Note the trailing "callback=?"
$.getJSON('http://developer.echonest.com/api/v4/song/search?api_key=' + key + '&artist=led+zeppelin&callback=?')
.done(function (data) {
    $('.songs').append('<li>success</li>');
    data.response.songs.forEach(function (song) {
        $('.songs').append('<li>' + song.title + '</li>');
    });
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM