2012-06-08 57 views
4

我拉從谷歌地圖的一些數據,但我似乎無法做任何事情。這裏是我的代碼:從谷歌解析json的iOS地理編碼數據

- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection { 

//do something with the data! 
NSError *e = nil; 
//parse the json data 
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: receivedData options: NSJSONReadingMutableContainers error: &e]; 

//get the lat and long and put it into an array 
locationData = [[NSMutableArray alloc] init]; 

NSLog(@"%@", [jsonArray objectAtIndex:0]); 

} 

如果我登錄jsonArray.count我得到2,這似乎是正確的,因爲谷歌將在頂層返回結果和狀態。但如果我試圖獲得對象0,它會崩潰。如果我嘗試做這樣的事情,它也崩潰:

- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection { 

//do something with the data! 
NSError *e = nil; 
//parse the json data 
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: receivedData options: NSJSONReadingMutableContainers error: &e]; 

//get the lat and long and put it into an array 
locationData = [[NSMutableArray alloc] init]; 

for(NSDictionary* thisLocationDict in jsonArray) { 

    NSString* location = [thisLocationDict objectForKey:@"results"]; 
    [locationData addObject:location]; 
} 
} 

我使用此代碼從Twitter獲取數據沒有問題。我在控制檯得到的錯誤是我試圖得到一個字符串的對象:

-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x798a270 

這裏的JSON谷歌是給我:

結果=( { 「address_components」 =( { 「LONG_NAME」= 2900; 「SHORT_NAME」= 2900; 類型=( 「street_number」 ); },{ 「long_n ame「=」Horizo​​n Dr「; 「short_name」=「Horizo​​n Dr」; ( 路線 ); }, { 「long_name」=「普魯士國王」; 「short_name」=「普魯士國王」; types =( locality, political ); }, { 「long_name」=「Upper Merion」; 「short_name」=「Upper Merion」; 類型=( 「administrative_area_level_3」, political ); }, { 「long_name」= Montgomery; 「short_name」=蒙哥馬利; types =( 「administrative_area_level_2」, political ); }, { 「long_name」= Pennsylvania; 「short_name」= PA; types =( 「administrative_area_level_1」, political ); }, { 「long_name」=「美國」; 「short_name」= US; 類型=( 國家, 政治 ); }, { 「long_name」= 19406; 「short_name」= 19406; types =( 「postal_code」 ); } ); 「formatted_address」=「2900地平線博士,普魯士國王,PA 19406,美國」; geometry = { location = { lat =「40.0896985」; lng =「-75。341717" ; }; 「LOCATION_TYPE」= ROOFTOP; 視= { 東北= { LAT = 「40.09104748029149」; LNG = 「-75.34036801970849」; }; 西南= { LAT = 「40.0883495197085」; LNG = 「-75.34306598029151」; }; }; }; 類型=( 「STREET_ADDRESS」 ); } ); 狀態= OK; }

和URL我傳遞:

http://maps.googleapis.com/maps/api/geocode/json?address=2900+Horizon+Drive+King+of+Prussia+,+PA&sensor=false 

任何知道我做錯了嗎?

+0

這是不是一個真正的解決方案爲您的例外,但我會建議你在系統內置的CLGeoCoder https://developer.apple.com/library/ios/#documentation/CoreLocation/Reference/CLGeocoder_class/Reference/Reference.html。你有地址,座標等。 – Lars

+0

嘿謝謝,我沒有想到蘋果提供了前瞻性的地理定位。活到老,學到老。 :D – PruitIgoe

回答

3

從您從谷歌獲取數據的區別是,它通過按鍵分開,如results, geometry, formatted_address ...

你應該做這樣的事情:

NSError *error; 

NSString *lookUpString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=%@&components=country:AU&sensor=false", self.searchBar.text]; 

lookUpString = [lookUpString stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 

NSData *jsonResponse = [NSData dataWithContentsOfURL:[NSURL URLWithString:lookUpString]]; 

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonResponse options:kNilOptions error:&error]; 

self.locationArray = [[jsonDict valueForKey:@"results"] valueForKey:@"formatted_address"]; 

int total = self.locationArray.count; 
NSLog(@"locationArray count: %d", self.locationArray.count); 

for (int i = 0; i < total; i++) 
{ 
    NSString *statusString = [jsonDict valueForKey:@"status"]; 
    NSLog(@"JSON Response Status:%@", statusString); 

    NSLog(@"Address: %@", [self.locationArray objectAtIndex:i]); 

}