doc92606
doc92606

Reputation: 701

Google Places API Parsing Details of Specific Location

I'm creating an app that uses the Google Places API to search for places near the user. When they tap on a pin, they are directed to the details page showing the details of that specific place they tapped on. As of now, I can get the names of the places but I can't get other stuff like "icon". Here is an example of how the JSON data is returned (this is from the documentation):

{
"html_attributions" : [],
"results" : [
  {
     "geometry" : {
        "location" : {
           "lat" : -33.870775,
           "lng" : 151.199025
        }
     },
     "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/travel_agent-71.png",
     "id" : "21a0b251c9b8392186142c798263e289fe45b4aa",
     "name" : "Rhythmboat Cruises",
     "opening_hours" : {
        "open_now" : true
     },
     "photos" : [
        {
           "height" : 270,
           "html_attributions" : [],
           "photo_reference" : "CnRnAAAAF-LjFR1ZV93eawe1cU_3QNMCNmaGkowY7CnOf-kcNmPhNnPEG9W979jOuJJ1sGr75rhD5hqKzjD8vbMbSsRnq_Ni3ZIGfY6hKWmsOf3qHKJInkm4h55lzvLAXJVc-Rr4kI9O1tmIblblUpg2oqoq8RIQRMQJhFsTr5s9haxQ07EQHxoUO0ICubVFGYfJiMUPor1GnIWb5i8",
           "width" : 519
        }
     ],
     "place_id" : "ChIJyWEHuEmuEmsRm9hTkapTCrk",
     "scope" : "GOOGLE",
     "alt_ids" : [
        {
           "place_id" : "D9iJyWEHuEmuEmsRm9hTkapTCrk",
           "scope" : "APP"
        }
     ],
     "reference" : "CoQBdQAAAFSiijw5-cAV68xdf2O18pKIZ0seJh03u9h9wk_lEdG-cP1dWvp_QGS4SNCBMk_fB06YRsfMrNkINtPez22p5lRIlj5ty_HmcNwcl6GZXbD2RdXsVfLYlQwnZQcnu7ihkjZp_2gk1-fWXql3GQ8-1BEGwgCxG-eaSnIJIBPuIpihEhAY1WYdxPvOWsPnb2-nGb6QGhTipN0lgaLpQTnkcMeAIEvCsSa0Ww",
     "types" : [ "travel_agency", "restaurant", "food", "establishment" ],
     "vicinity" : "Pyrmont Bay Wharf Darling Dr, Sydney"
  },
  {
     "geometry" : {
        "location" : {
           "lat" : -33.866891,
           "lng" : 151.200814
        }
     },
     "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png",
     "id" : "45a27fd8d56c56dc62afc9b49e1d850440d5c403",
     "name" : "Private Charter Sydney Habour Cruise",
     "photos" : [
        {
           "height" : 426,
           "html_attributions" : [],
           "photo_reference" : "CnRnAAAAL3n0Zu3U6fseyPl8URGKD49aGB2Wka7CKDZfamoGX2ZTLMBYgTUshjr-MXc0_O2BbvlUAZWtQTBHUVZ-5Sxb1-P-VX2Fx0sZF87q-9vUt19VDwQQmAX_mjQe7UWmU5lJGCOXSgxp2fu1b5VR_PF31RIQTKZLfqm8TA1eynnN4M1XShoU8adzJCcOWK0er14h8SqOIDZctvU",
           "width" : 640
        }
     ],
     "place_id" : "ChIJqwS6fjiuEmsRJAMiOY9MSms",
     "scope" : "GOOGLE",
     "reference" : "CpQBhgAAAFN27qR_t5oSDKPUzjQIeQa3lrRpFTm5alW3ZYbMFm8k10ETbISfK9S1nwcJVfrP-bjra7NSPuhaRulxoonSPQklDyB-xGvcJncq6qDXIUQ3hlI-bx4AxYckAOX74LkupHq7bcaREgrSBE-U6GbA1C3U7I-HnweO4IPtztSEcgW09y03v1hgHzL8xSDElmkQtRIQzLbyBfj3e0FhJzABXjM2QBoUE2EnL-DzWrzpgmMEulUBLGrtu2Y",
     "types" : [ "restaurant", "food", "establishment" ],
     "vicinity" : "Australia"
  },
  {
     "geometry" : {
        "location" : {
           "lat" : -33.870943,
           "lng" : 151.190311
        }
     },
     "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png",
     "id" : "30bee58f819b6c47bd24151802f25ecf11df8943",
     "name" : "Bucks Party Cruise",
     "opening_hours" : {
        "open_now" : true
     },
     "photos" : [
        {
           "height" : 600,
           "html_attributions" : [],
           "photo_reference" : "CnRnAAAA48AX5MsHIMiuipON_Lgh97hPiYDFkxx_vnaZQMOcvcQwYN92o33t5RwjRpOue5R47AjfMltntoz71hto40zqo7vFyxhDuuqhAChKGRQ5mdO5jv5CKWlzi182PICiOb37PiBtiFt7lSLe1SedoyrD-xIQD8xqSOaejWejYHCN4Ye2XBoUT3q2IXJQpMkmffJiBNftv8QSwF4",
           "width" : 800
        }
     ],
     "place_id" : "ChIJLfySpTOuEmsRsc_JfJtljdc",
     "scope" : "GOOGLE",
     "reference" : "CoQBdQAAANQSThnTekt-UokiTiX3oUFT6YDfdQJIG0ljlQnkLfWefcKmjxax0xmUpWjmpWdOsScl9zSyBNImmrTO9AE9DnWTdQ2hY7n-OOU4UgCfX7U0TE1Vf7jyODRISbK-u86TBJij0b2i7oUWq2bGr0cQSj8CV97U5q8SJR3AFDYi3ogqEhCMXjNLR1k8fiXTkG2BxGJmGhTqwE8C4grdjvJ0w5UsAVoOH7v8HQ",
     "types" : [ "restaurant", "food", "establishment" ],
     "vicinity" : "37 Bank St, Pyrmont"
  },
  {
     "geometry" : {
        "location" : {
           "lat" : -33.867591,
           "lng" : 151.201196
        }
     },
     "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/travel_agent-71.png",
     "id" : "a97f9fb468bcd26b68a23072a55af82d4b325e0d",
     "name" : "Australian Cruise Group",
     "opening_hours" : {
        "open_now" : true
     },
     "photos" : [
        {
           "height" : 242,
           "html_attributions" : [],
           "photo_reference" : "CnRnAAAABjeoPQ7NUU3pDitV4Vs0BgP1FLhf_iCgStUZUr4ZuNqQnc5k43jbvjKC2hTGM8SrmdJYyOyxRO3D2yutoJwVC4Vp_dzckkjG35L6LfMm5sjrOr6uyOtr2PNCp1xQylx6vhdcpW8yZjBZCvVsjNajLBIQ-z4ttAMIc8EjEZV7LsoFgRoU6OrqxvKCnkJGb9F16W57iIV4LuM",
           "width" : 200
        }
     ],
     "place_id" : "ChIJrTLr-GyuEmsRBfy61i59si0",
     "scope" : "GOOGLE",
     "reference" : "CoQBeQAAAFvf12y8veSQMdIMmAXQmus1zqkgKQ-O2KEX0Kr47rIRTy6HNsyosVl0CjvEBulIu_cujrSOgICdcxNioFDHtAxXBhqeR-8xXtm52Bp0lVwnO3LzLFY3jeo8WrsyIwNE1kQlGuWA4xklpOknHJuRXSQJVheRlYijOHSgsBQ35mOcEhC5IpbpqCMe82yR136087wZGhSziPEbooYkHLn9e5njOTuBprcfVw",
     "types" : [ "travel_agency", "restaurant", "food", "establishment" ],
     "vicinity" : "32 The Promenade, King Street Wharf 5, Sydney"
  }
],
"status" : "OK"

Here is my code on how I fetch it:

 NSArray* places = [json objectForKey:@"results"];
NSArray *placeIconArray = [json objectForKey:@"icon"];

for (NSString *imgString in placeIconArray)
{
    NSLog(@"%@", imgString);
}

if ([places count] == 0)
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Sorry" message:@"Couldn't find any of those places near you" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:@"Cancel", nil];
    [alertView show];
}


[self plotPositions:places];

I can plot the places fine, but when I put breakpoints in my app the imgString returns nil. How can I parse this correctly so I can get the imgString?

All help is appreciated, thanks in advance :)

Upvotes: 0

Views: 735

Answers (1)

rmaddy
rmaddy

Reputation: 318874

You are not processing the data correctly. places contains an array of dictionaries. It's each of those dictionaries that contains an "icon".

NSArray* places = [json objectForKey:@"results"];
for (NSDictionary *place in places) {
    NSString *icon = place[@"icon"];
    // do something with the icon URL
}

One thing you could do, is get the array of icons using KVC:

NSArray *icons = [places valueForKey:@"icon"];

This will create an array of icon values from the array of dictionaries.

Upvotes: 1

Related Questions