iosjsonobjective-csoundcloud

Parsing SoundCloud - Change API Call, not receiving JSON data?


I'm playing around with the SoundCloud iOS tutorial and have been changing the API calls to get different information.

However, I can't seem to get any JSON back for a call I make to the API when I try to do a GET request on the URL https://api.soundcloud.com/me/activities/tracks/affiliated.json. The GET request works in the API console. Other GET requests work too, so I'm thinking that it's the definitely the way I'm asking for information in Xcode.

Here's the "Money" part of the program - gets the data, parses, creates a new view controller that has an array as a property with the response.

    SCRequestResponseHandler handler;
    handler = ^(NSURLResponse *response, NSData *data, NSError *error) {
        NSError *jsonError = nil;
        NSJSONSerialization *jsonResponse = [NSJSONSerialization
                                             JSONObjectWithData:data
                                                        options:0
                                                          error:&jsonError];
        if (!jsonError && [jsonResponse isKindOfClass:[NSArray class]]) {
            UIStoryboard *sb = self.storyboard;
            SCTTrackListViewController *trackListVC;
            trackListVC = [sb instantiateViewControllerWithIdentifier:@"TLVC"];
            trackListVC.tracks = (NSArray *)jsonResponse;

            // Am I getting JSON back for tracks/affiliated.json ?
            NSLog(@"json %@",(NSArray *)jsonResponse);

            [self presentViewController:trackListVC
                               animated:YES
                             completion:nil];
        }
    };

    NSString *resourceURL = @"https://api.soundcloud.com/me/activities/tracks/affiliated.json";

    [SCRequest performMethod:SCRequestMethodGET
                  onResource:[NSURL URLWithString:resourceURL]
             usingParameters:nil
                 withAccount:account
      sendingProgressHandler:nil
             responseHandler:handler];
}

If I use NSString *resourceURL = @"https://api.soundcloud.com/me/tracks.json"; or NSString *resourceURL = @"https://api.soundcloud.com/me/favorites.json"; then I get a list of tracks returned in JSON. If I use the one in the code example, I get no response - total silence.

The JSON response I get for https://api.soundcloud.com/me/favorites.json is in the form of

[
   {
    "kind": "track",
    "id": 112547469,
    "created_at": "2013/09/26 06:50:06 +0000",
    "user_id": 294371,
    "duration": 4499751,
    "commentable": true,
    "state": "finished",
    "original_content_size": 143977742,
    "sharing": "public",
    "tag_list": "Funk Disco",
    "permalink": "the-boogie-down",
    "streamable": true,
    "embeddable_by": "all",
    "downloadable": false,
    "purchase_url": null,
    "label_id": null,
    "purchase_title": null,
    "genre": "Boogie",
    "title": "The Boogie Down",
    "description": "1.\tWar - The World Is A Ghetto (Suonho Edit)\r\n\r\n2. \tWhiskey Barons - The Same Love\r\n\r\n3.\tRayko - Broadway\r\n\r\n4.\tNicholas - Talking About Love\r\n\r\n5.\tBen E. King - Supernatural Thing (Fingerman Edit)\r\n\r\n6.\tGazeebo - Scaredy Cat\r\n\r\n7.\tFingerman - Fat Like You Know\r\n\r\n8.\tWillie Beaver - Party Time (Karim Edit)\r\n\r\n9.\tDeadly Sins - I Can Feel It\r\n\r\n10.\tFingerman - Tootin\r\n\r\n11.\tRocco Raimundo - Give Me Your Love\r\n\r\n12.\tLuther Vandross - Never Too Much\r\n\r\n13.\tKool & The Gang - Get Down On It (Rocco Raimundo Edit)",
    "label_name": "",
    "release": "",
    "track_type": "",
    "key_signature": "",
    "isrc": "",
    "video_url": null,
    "bpm": null,
    "release_year": null,
    "release_month": null,
    "release_day": null,
    "original_format": "mp3",
    "license": "all-rights-reserved",
    "uri": "https://api.soundcloud.com/tracks/112547469",
    "user":  {
      "id": 294371,
      "kind": "user",
      "permalink": "web_d",
      "username": "webd",
      "uri": "https://api.soundcloud.com/users/294371",
      "permalink_url": "http://soundcloud.com/web_d",
      "avatar_url": "https://i1.sndcdn.com/avatars-000011907556-1k1cgw-large.jpg?3eddc42"
    },
    "user_playback_count": 1,
    "user_favorite": true,
    "permalink_url": "http://soundcloud.com/web_d/the-boogie-down",
    "artwork_url": "https://i1.sndcdn.com/artworks-000058671332-jzz9uc-large.jpg?3eddc42",
    "waveform_url": "https://w1.sndcdn.com/qA5zJCmDqO46_m.png",
    "stream_url": "https://api.soundcloud.com/tracks/112547469/stream",
    "playback_count": 69,
    "download_count": 0,
    "favoritings_count": 1,
    "comment_count": 0,
    "attachments_uri": "https://api.soundcloud.com/tracks/112547469/attachments"
  },

whilst the response for https://api.soundcloud.com/me/activities/tracks/affiliated.json goes:

{
  "collection":  [
     {
      "type": "track",
      "created_at": "2013/10/08 20:14:16 +0000",
      "origin":  {
        "kind": "track",
        "id": 114421587,
        "created_at": "2013/10/08 18:20:21 +0000",
        "user_id": 144598,
        "duration": 340616,
        "commentable": true,
        "state": "finished",
        "original_content_size": 13624479,
        "sharing": "public",
        "tag_list": "",
        "permalink": "faden-away",
        "streamable": true,
        "embeddable_by": "all",
        "downloadable": false,
        "purchase_url": null,
        "label_id": null,
        "purchase_title": null,
        "genre": "Funk",
        "title": "Faden Away",
        "description": "",
        "label_name": "",
        "release": "",
        "track_type": "",
        "key_signature": "",
        "isrc": "",
        "video_url": null,
        "bpm": null,
        "release_year": null,
        "release_month": null,
        "release_day": null,
        "original_format": "mp3",
        "license": "all-rights-reserved",
        "uri": "https://api.soundcloud.com/tracks/114421587",
        "user":  {
          "id": 144598,
          "kind": "user",
          "permalink": "stonesthrow",
          "username": "Stones Throw Records",
          "uri": "https://api.soundcloud.com/users/144598",
          "permalink_url": "http://soundcloud.com/stonesthrow",
          "avatar_url": "https://i1.sndcdn.com/avatars-000001771161-2x04bn-large.jpg?3eddc42"
        },
        "user_playback_count": 1,
        "user_favorite": false,
        "permalink_url": "http://soundcloud.com/stonesthrow/faden-away",
        "artwork_url": "https://i1.sndcdn.com/artworks-000059640743-qtexag-large.jpg?3eddc42",
        "waveform_url": "https://w1.sndcdn.com/NBZ15f1BZ4cV_m.png",
        "stream_url": "https://api.soundcloud.com/tracks/114421587/stream",
        "playback_count": 29756,
        "download_count": 0,
        "favoritings_count": 1587,
        "comment_count": 138,
        "attachments_uri": "https://api.soundcloud.com/tracks/114421587/attachments",
        "sharing_note":  {
          "text": "",
          "created_at": "2013/10/08 20:14:16 +0000"
        }
      },
      "tags": "affiliated"
    },
     {
      "type": "track",
      "created_at": "2013/10/08 14:26:00 +0000",
      "origin":  {
        "kind": "track",
        "id": 112820793,
        "created_at": "2013/09/27 21:39:16 +0000",
        "user_id": 1520490,
        "duration": 290926,
        "commentable": true,
        "state": "finished",
        "original_content_size": 12579855,
        "sharing": "public",
        "tag_list": ""MUSEUM OF LOVE" "DFA RECORDS" "PAT MAHONEY" "LCD SOUNDSYSTEM" "THE JUAN MACLEAN" JEE DAY DFA",
        "permalink": "museum-of-love-monotronic",
        "streamable": true,
        "embeddable_by": "all",
        "downloadable": false,
        "purchase_url": "https://itunes.apple.com/album/monotronic-single/id711563768",
        "label_id": null,
        "purchase_title": "DIGITAL SINGLE",
        "genre": "",
        "title": "Museum of Love - Monotronic",
        "description": "Museum Of Love\n"Monotronic"\n\nDFA2390\n\nfirst single "Down South" available here: http://store.dfarecords.com/products/dfa2389",
        "label_name": "DFA Records",
        "release": "DFA2390",
        "track_type": "original",
        "key_signature": "",
        "isrc": "",
        "video_url": "http://www.youtube.com/watch?v=K2E6oK7tN5w",
        "bpm": null,
        "release_year": 2013,
        "release_month": 10,
        "release_day": 8,
        "original_format": "mp3",
        "license": "all-rights-reserved",
        "uri": "https://api.soundcloud.com/tracks/112820793",
        "user":  {
          "id": 1520490,
          "kind": "user",
          "permalink": "dfa-records",
          "username": "DFA Records",
          "uri": "https://api.soundcloud.com/users/1520490",
          "permalink_url": "http://soundcloud.com/dfa-records",
          "avatar_url": "https://i1.sndcdn.com/avatars-000002067008-el39h6-large.jpg?3eddc42"
        },
        "user_playback_count": 1,
        "user_favorite": false,
        "permalink_url": "http://soundcloud.com/dfa-records/museum-of-love-monotronic",
        "artwork_url": "https://i1.sndcdn.com/artworks-000058798982-ogzv3j-large.jpg?3eddc42",
        "waveform_url": "https://w1.sndcdn.com/0m0pwUhjvenc_m.png",
        "stream_url": "https://api.soundcloud.com/tracks/112820793/stream",
        "playback_count": 10047,
        "download_count": 0,
        "favoritings_count": 309,
        "comment_count": 18,
        "attachments_uri": "https://api.soundcloud.com/tracks/112820793/attachments",
        "sharing_note":  {
          "text": "",
          "created_at": "2013/09/27 21:39:16 +0000"
        }
      },
      "tags": "affiliated"
    },

I'm trying to store the response in an NSArray, and I think that might be the issue... can someone point me in the right direction to get the JSON for affiliated.json? Is the response of the second JSON a dictionary? Do I need to store the response for that one differently? I thought I could store a dictionary in an NSArray...


Solution

  • The reason I was getting back nothing was due to this line: NSLog(@"json %@",(NSArray *)jsonResponse); where I was casting jsonResponse as an NSArray. This worked in the first instance because the response was an array, but in the second instance the response was a dictionary. Pretty obvious now that I think about it. I changed that line to (NSDictionary *)jsonResponse and all was well.

    After I received the JSON data, this was also a good way to experiment with the different ways to dig into the nested info in the data. For instance, I created a dictionary to hold jsonResponse. I could get the info for the key I wanted in a couple of ways:

    dictionary[@"user"][@"avatar_url] would get the nested value for avatar_url which was itself nested in user.

    I could also do this by calling [dictionary valueForKeyPath:@"user.avatar_url"];