2011-10-08 66 views
0

我在解析Google地方信息中的JSON時遇到問題。JSON框架解析錯誤

我有解析它下面的代碼:

NSString *myRawJson = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"https://maps.googleapis.com/maps/api/place/search/json?location=-15.815347,-47.9164097&radius=500&types=bank&sensor=true&key=AIzaSyBLY-lBALViJ6ybrgtOqQGhsCDQtsdKsnc"]]; 

    if ([myRawJson length] == 0) { 
     [myRawJson release]; 
     return; 
    } 

    SBJSON *parser = [[SBJSON alloc] init]; 

    list = [[parser objectWithString:myRawJson error:nil] copy]; 

    NSDictionary *results = [myRawJson JSONValue]; 

    placesLatitudes = [[NSMutableArray alloc] init]; 
    NSDictionary *latslngs = [[results objectForKey:@"results"] valueForKey:@"location"]; 
    NSArray *teste = [latslngs objectForKey:@"location"]; 

    for (NSDictionary *element in teste) 
    { 
     NSString *latitude = [element objectForKey:@"lat"]; 
     NSLog(@"%@", latitude); 
    } 

    [parser release]; 

的URL請求返回以下JSON:

{ 
    "html_attributions" : [ "Listagens por \u003ca href=\"http://www.telelistas.net/\"\u003eTelelistas\u003c/a\u003e" ], 
    "results" : [ 
     { 
     "geometry" : { 
      "location" : { 
       "lat" : -15.8192680, 
       "lng" : -47.9146680 
      } 
     }, 
     "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png", 
     "id" : "1a01f2887f1a70bd430d6a7ffa2a7e46974a1cb7", 
     "name" : "Banco Bradesco S/A", 
     "reference" : "CnRqAAAAXr_6FCDMlpeVF-E0b3cDxNFGzmS1bYBBGc4v4lKrcusGQPEnx1MXnCJVb3nCVWalu2IOwN9oSVtcXS6_W8JLL_CMhKzkm75UqGt5ShX_s0d4coxOBYsbo66JP1NpF9c5Ua7OxyjepQferD6SbAIjIhIQZ6qcgQT8hqAXtFTuPzuZThoUhrCcxKMRwZq2vl8Sv8LJes7d-no", 
     "types" : [ "bank", "finance", "establishment" ], 
     "vicinity" : "CRS 511 Bl B s/n lj 15/21 - Brasília" 
     }, 
     { 
     "geometry" : { 
      "location" : { 
       "lat" : -15.8177890, 
       "lng" : -47.9126370 
      } 
     }, 
     "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png", 
     "id" : "e2c56c8ca6643e0f0cef6bd0405fd8c6a30850ad", 
     "name" : "UNIBANCO-União de Bancos Brasileiros S/A", 
     "reference" : "CpQBgQAAABkp74S1WF0LfZEhkNj6TUbmiPu2djL81IDnFMJhRR2HDx7336PlRh46q16FwCao290T1smo1wNsGQ-sRVZ_S-MClYUDQzdpaTdNVty0JHBjQTEOMVo0yW8Uzd_OcuI12v8eZ81wu5V7sgHomBw-SeE-mhrPntOU1EzmOANNhIDRExdKmrof2hIKHdLJJaccdRIQeQ9uN-L66Ztmz4_2dkk7DhoUZxcYaZqXgXXnAwWB97e6bNCNp8A", 
     "types" : [ "bank", "finance", "establishment" ], 
     "vicinity" : "Bl CRS 510 Bl A s/n - Brasília" 
     } 
    ], 
    "status" : "OK" 
} 

我試圖讓路徑結果>幾何信息>位置>緯度,但我與上面的代碼我得到的錯誤: - [__ NSArrayI objectForKey:]:無法識別的選擇發送到實例0x5a526e0。

有人知道如何使用JSON框架爲iOS解析這些數據? 謝謝!

回答

3

結果是一個數組,而不是字典。位置是一個字典,而不是一個數組。

NSDictionary *results = [myRawJson JSONValue]; 

foreach (NSDictionary *result in [results objectForKey:@"results"]) 
{ 
    NSDictionary *location = [[result objectForKey:@"geometry"] objectForKey:@"location"]; 
    NSString *latitude = [location objectForKey:@"lat"]; 
    NSString *longitude = [location objectForKey:@"lng"]; 
} 

我沒有測試編譯該代碼,但它應該是關閉的。

+0

另一個要注意的是,'location'是一個字典,因此,必須使用快速枚舉被枚舉,或'allKeys'陣列。 –

+0

誠然,如果需要枚舉,但它不是這種情況。 – Flyingdiver

3
Here Parse Data From Google Map API  

-(NSString *)getAddressFromLatLon:(double)pdblLatitude withLongitude:(double)pdblLongitude 
    { 

     NSString *urlString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=true",pdblLatitude, pdblLongitude]; 
     NSError* error; 
     NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString] encoding:NSASCIIStringEncoding error:&error]; 
     // NSLog(@"%@",locationString); 

     locationString = [locationString stringByReplacingOccurrencesOfString:@"\"" withString:@""]; 


     NSURL *requestURL = [NSURL URLWithString:urlString]; 
     NSURLRequest *request = [NSURLRequest requestWithURL:(requestURL)]; 

     //response 
     NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

     NSError *jsonParsingError = nil; 
     NSDictionary *locationResults = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError]; 
     if ([locationResults count]==0) { 

      [AQHelper showAlert:self withTitle:@"Empty Location" withMessage:@"Location Not Found!"]; 
      return nil; 
     } 
     else{ 

     NSString *fullAddress = [[[locationResults objectForKey:@"results"] objectAtIndex:0] objectForKey:@"formatted_address"] 
     ; 

     self.address=fullAddress; 

     id allValues = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError]; 


     NSArray *result = [(NSDictionary*)allValues objectForKey:@"results"]; 

    // for(int i=0;i<[result count];i++) 
    // { 
      NSDictionary *values = (NSDictionary*)[result objectAtIndex:0]; 

      NSArray *component = [(NSDictionary*)values objectForKey:@"address_components"]; 

      for(int j=0;j<[component count];j++) 
      { 
       NSDictionary *parts = (NSDictionary*)[component objectAtIndex:j]; 
       if([[parts objectForKey:@"types"] containsObject:@"route"]) 
       { 
        if ([parts objectForKey:@"long_name"]!=0) { 
         self.street=[parts objectForKey:@"long_name"]; 
        } 
        else{ 
         self.street=[parts objectForKey:@"short_name"]; 
        } 



       } 

       if([[parts objectForKey:@"types"] containsObject:@"locality"]) 
       { 

        if ([parts objectForKey:@"long_name"]!=0) { 
         self.city=[parts objectForKey:@"long_name"]; 
        } 
        else{ 
         self.city=[parts objectForKey:@"short_name"]; 
        } 

       } 


       if([[parts objectForKey:@"types"] containsObject:@"administrative_area_level_2"]) 
       { 

        if ([parts objectForKey:@"long_name"]!=0) { 
         self.state=[parts objectForKey:@"long_name"]; 
        } 
        else{ 
         self.state=[parts objectForKey:@"short_name"]; 
        } 

       } 

       if([[parts objectForKey:@"types"] containsObject:@"postal_code"]) 
       { 

        if ([parts objectForKey:@"long_name"]!=0) { 
         self.zip=[parts objectForKey:@"long_name"]; 
        } 
        else{ 
         self.zip=[parts objectForKey:@"short_name"]; 
        } 

       } 
      } 
     } 

     return self.address; 

    }