获取特定的密钥JSON解析器IOS

时间:2013-02-11 13:41:38

标签: iphone json parsing nsdictionary nsjsonserialization

我在JSON文件中获取特定密钥时遇到一些问题。 事实上,我正在使用MapView和JSON文件以及一些餐馆坐标。

我可以显示我的JSON文件的内容,但我无法获得密钥:lat(纬度)和lng(经度)。

这是我的JSON文件:

{
   "html_attributions" : [
      "Adresses fournies par \u003ca href=\"http://www.yellowpages.com.au/\"\u003eYellow Pages\u003c/a\u003e"
   ],
   "next_page_token" : "ClRNAAAAtyfgXsHo6S4iCel9hSfwlphKSXVDh6Nb-PyQfYSGmGhSygljtG9GpZRL8Yfpka-ijz3WvES9b7Fil_PBX4lCfdl2agVIuIACCkAgeS05M8gSEK7qCd3HTQZFLBCRNcqhzkwaFIONRXOWfLV7IG6WYdQvu9mLTpxL",
   "results" : [
      {
         "geometry" : {
            "location" : {
               "lat" : -33.8681990,
               "lng" : 151.1945850
            }
         },
         "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png",
         "id" : "edd23ebe6cd17dcbd9139e2643324c9195a9e3e3",
         "name" : "The Star",
         "opening_hours" : {
            "open_now" : true
         },
         "photos" : [
            {
               "height" : 1224,
               "html_attributions" : [ "Utilisateur Google" ],
               "photo_reference" : "CoQBfgAAAAecfnYhSZSQipHCYDPgsfLe8rkSAVmM6D6yQg7OKHviC_JvESqcgwFEQPITibnD-BrbNMQ5AvH81qJ99F5G6WmfWn3csIUOeXirwxUuqOUz7eWimBvEcPCaWVcL3E9NJCGQY3T12ElETuqZosJ2NV4igwxvNmmuqIzCOs7sRzpNEhDYfNl7hR5jKzdLoI0MW2WUGhTHmX-XTNrMJIJ0uATulmdpFGWg_Q",
               "width" : 1632
            }
         ],
         "rating" : 4.20,
         "reference" : "CnRlAAAA4XhqmCyMUjmvRIgn-Brf4uubjgcISREb1m7SR4HPlkYauFAKYTnbixBAKjbJE9gzZ7Sk_PaBT7qF5GWynfqIXv9_mgZqgQTVn6fA5Xy0QESzs2Q70o49T7G2E1wrrE4frK13o1_xx6iqxvPsYLSCjBIQX5NR5WgFPscjobiWYalyYxoUIy68fs-7HekAPhpmwRr2FraDi3c",
         "types" : [ "restaurant", "lodging", "food", "casino", "establishment" ],
         "vicinity" : "80 Pyrmont Street, Pyrmont"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : -33.8656630,
               "lng" : 151.191280
            }
         },
         "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/bar-71.png",
         "id" : "78b3ab3969c71d9c4ca369a4c54e64291bc48013",
         "name" : "Sugaroom",
         "photos" : [
            {
               "height" : 459,
               "html_attributions" : [],
               "photo_reference" : "CnRjAAAAQTgc4gBnL5qnXSxQZHPwSklMTAhlIFOQVcAnRP54JhttkSnfYayzoXqEFVf1FgEcZDePXR_ak5VrX94WtuXCsAxFHTUjruEFS6t-KZ1pZkV0lMJr5ScrkyQKbkz_4RC5ndMdkV-zk_BEGxehXtf1TxIQk6d-sL5CE4jTCkFpy-xxLBoUGDRSr7-DByGfguvq66dIRl2u4sE",
               "width" : 612
            }
         ],
         "price_level" : 3,
         "rating" : 4.20,
         "reference" : "CnRmAAAAJRV1ZXqRygLrNNpVgXdLT6UVb9rtttnEJBzui5bc8154vk7b0cUleXuKOypo1t9Wf9rJGp8qzq2zEGg2ExCKbZKRz_Nw-PlTKd5TuzSFjkgucSKYwmtd0LsgAK1rmgrYsm167g4_gSjFiDUlKvkbkxIQpgOyN66atH_smg785i8ZlRoUApskjjgRN2EZP6_u6mvYUd7HA2U",
         "types" : [ "food", "bar", "establishment" ],
         "vicinity" : "2/1 Harris Street, Pyrmont"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : -33.8698080,
               "lng" : 151.1971550
            }
         },
         "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/bar-71.png",
         "id" : "f08757f3d7c5d879297b3cb715b33f1fae63536b",
         "name" : "Oscars Lounge Bar and Restaurant",
         "opening_hours" : {
            "open_now" : false
         },
         "photos" : [
            {
               "height" : 640,
               "html_attributions" : [],
               "photo_reference" : "CpQBhgAAAFVwH5dzlEpvO1jsuTN6-I6bDc9Y3NUGbIOWpT7UjFJIVImCajv-kJYbObXXta1aR-eemuk4OgLA23rz5iNZcsqmWa9gt6tRoLmF5bO5ak4cgdQIUOJbf4LkxAKWYt5W1NGRMTqx_a6uf6SHQ0ftp-PuxneWKhpfddsMbvRE34pJnrgkJ8WftQf14V0jdQSSGRIQDODym-kvSkgFaTxEN-VRHxoUDohc30odzsSMhw3qcBEMrgfdP74",
               "width" : 427
            }
         ],
         "rating" : 3.50,
         "reference" : "CoQBfgAAALY2CvGQEQSrPlpvCQX_NMpuuwD7iy9tgqS3RT7cnssgodZ9_cenagjN7QKTlZO8_31AdwVSdvANIdceZsPI3YGhUyPO-NfeuE9-fIMHDVH5fy08OsDpVZXAIgeilwKx-Gbf6heZhte3Ec7OVJKh2jTZSvGEd_Q8TcYeaBRxp4hTEhCrqMLPES46AhV0pKw3_9xNGhREzvfuZepHG9rLEdy2HLUVwdK6YQ",
         "types" : [ "bar", "restaurant", "food", "establishment" ],
         "vicinity" : "84 Union Street, Pyrmont"
      }
   ],
   "status" : "OK"
}

这是我的IOS代码:

- (IBAction)refreshTapped:(id)sender {

    // Charge le fichie JSON
    NSString *fileName = [[NSBundle mainBundle] pathForResource:@"map" ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:fileName];

    // Parse le fichier JSON
    NSError *error;
    NSDictionary *dico = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
    NSArray *array = [dico valueForKeyPath:@"results"];

    if(error != nil)
    {
        NSLog(@"Erreur...");
    }else{
        NSLog(@"%@",array);
    }

    CLLocationCoordinate2D location;
    NSMutableArray *newAnnotations = [NSMutableArray array];
    MKPointAnnotation *newAnnonation;

    for (dico in array) {

        // Récupère longitude et latitude
        location.latitude = [dico[@"lat"] doubleValue];
        location.longitude = [dico[@"lng"] doubleValue];

        NSLog(@"Latitude: %f",[dico[@"lat"] doubleValue]);
        NSLog(@"Longitude: %f",[dico[@"lng"] doubleValue]);

        // Créer les annotations
        newAnnonation = [[MKPointAnnotation alloc] init];
        newAnnonation.title = dico[@"name"];
        newAnnonation.coordinate = location;

        // On ajoute l'objet au tableau
        [newAnnotations addObject:newAnnonation];  

    }

    // On ajoute les annotations à la vue
    [self._mapView addAnnotations:newAnnotations];

    // Ajouter la carte à la vue
    [self.view insertSubview:__mapView atIndex:0];

}

非常感谢你!

3 个答案:

答案 0 :(得分:1)

这是因为latlng是数组中每个项目的子键:

 "geometry" : {
     "location" : {
          "lat" : -33.8698080,
          "lng" : 151.1971550
     }
   }

因此,您必须检索完整路径:

location.latitude = [[dico valueForKeyPath:@"geometry.location.lat"] doubleValue];
location.longitude  = [[dico valueForKeyPath:@"geometry.location.lng"] doubleValue]; 

答案 1 :(得分:1)

NSArray *array = [dictionary valueForKeyPath:@"results"];

NSDictionary *subDict;
for (NSDictionary *dictionary in array) {
    subDict = dictionary[@"geometry"];
    subDict = subDict[@"location"];
    DLog(@"%@", subDict[@"lat"]);

}

答案 2 :(得分:0)

NSArray *array = [dico valueForKeyPath:@"results"];
for (NSDictionary *result in array)
{
    NSDictionary *geometry = result[@"geometry"];
    NSDictionary *location = geometry[@"location"];
    location.latitude = [dico[@"lat"] doubleValue];
    location.longitude = [dico[@"lng"] doubleValue];
}