-1

我正在学习如何解析 JSON。我已经制作了 raywenderlich 教程,但我仍然迷失了一些步骤。我有自己的 JSON:

{
    "Albumvideo":{
        "album01":{
            "titreAlbum":"Publicité",
            "photoAlbum":"blabla.jpg",
            "pubVideos":{
                "pub01":[
                {
                "titrePub":"Chauffage Compris",
                "dureePub":"01'25''",
                "photoPub":"chauffage.jpg",
                "lienPub":"http://www.wmstudio.ch/videos/chauffage.mp4"
                }
                ]
            }
        },
        "album02":{
            "titreAlbum":"Events",
            "photoAlbum":"bloublou.jpg",
            "eventsVideos":{
                "event01":[
                {
                "titreEvent":"Chauffage Compris",
                "dureeEvent":"01'25''",
                "photoEvent":"chauffage.jpg",
                "lienEvent":"http://www.wmstudio.ch/videos/chauffage.mp4"
                }
                ]
            }
        }
    }
}

我得到了我的“代码”来解析我的 JSON:

- (void) viewDidLoad
{
    [super viewDidLoad];

    dispatch_async (kBgQueue, ^{
        NSData* data = [NSData dataWithContentsOfURL:lienAlbumsVideo];
        [self performSelectorOnMainThread:@selector(fetchedData:)withObject:data waitUntilDone:YES];
    });
}
- (void)fetchedData:(NSData *)responseData {
    //parse out the json data
    NSError* error;
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
    NSArray* albumsVideo = [json objectForKey:@"Albumvideo"];

    NSLog(@"Nombre d'albums : %i",[albumsVideo count]);

}

这很好用,我的 NSLog 返回“2”。例如,我现在遇到的困难是用“titreAlbum”或“event01”制作一个数组。如果我做 :

NSArray* event01 = [json objectForKey:@"event01"];
NSLog(@"Number of objects in event01 : %i ", [event01 count]);

我的 NSLog 返回“0”。

我真的不明白如何从 JSON 中的多维数组中解析信息。已经谢谢了!

尼古拉斯

4

3 回答 3

2

您没有二维数组。JSON 不支持这一点,但数组的数组(就像 C 和 Objective-C 一样)。

NSDictionary *document = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

// Getting titreAlbum
NSDictionary *albumVideo = document[@"Albumvideo"];

NSDictionary *album01 = albumVideo[@"album01"];

NSString *titreAlbum = album01[@"titreAlbum"];

// Getting an event

NSDictionary *album02 = albumVideo[@"album02"];
NSDictionary *eventVideos = album02[@"eventsVideos"];
NSArray *event01 = eventVideo[@"event01"];

(在 Safari 中输入)

如果您对中间层不感兴趣,也可以使用 KVC。

但是您的标识符和问题让我想,您的 JSON 的结构格式不正确。

于 2013-06-14T07:36:54.487 回答
1

有些东西,每次看到

{ ... }

在作为开头/结尾的 json 中NSDictionary

一旦解析,而

[ ... ]

是 a 的开头结尾NSArray

因此,一旦您使用解析 json,NSJSONSerialization您就可以使用该知识导航该字典。

给定 json 你必须得到一个数组,"titreAlbum"你必须做类似的事情:

NSDictionary *albumVideo = json[@"Albumvideo"];
NSMutableArray *albumTitres = [[NSMutableArray alloc] init];
for (NSDictionary *album in albumVideo) {
    [albumTitres addObject:album[@"titreAlbum"]];
}

也就是说,我认为您的 json 并没有像通过 JSONLint 验证那样格式错误,但没有帮助您解析它。我希望这Albumvideo是一个专辑数组,而不是专辑字典。

于 2013-06-14T07:56:15.923 回答
0

我遇到过同样的问题。我实际上是在尝试访问我需要获取的Google Distance API

{
 "routes" : [
  {
     "bounds" : {
        "northeast" : {
           "lat" : 23.0225066,
           "lng" : 73.2544778
        },
        "southwest" : {
           "lat" : 19.0718263,
           "lng" : 72.57129549999999
        }
     },
     "copyrights" : "Map data ©2014 Google",
     "legs" : [
        {
           "distance" : {
              "text" : "524 km",
              "value" : 523839
           },
           "duration" : {
              "text" : "7 hours 34 mins",
              "value" : 27222
           },
           "end_address" : "Mumbai, Maharashtra, India",
           "end_location" : {
              "lat" : 19.0759856,
              "lng" : 72.8776573
           },
           "start_address" : "Ahmedabad, Gujarat, India",
           "start_location" : {
              "lat" : 23.0225066,
              "lng" : 72.57129549999999
           },
           "steps" : [
              {
                 "distance" : {
                    "text" : "0.2 km",
                    "value" : 210
                 },
                 "duration" : {
                    "text" : "1 min",
                    "value" : 25
                 },
                 "end_location" : {
                    "lat" : 23.0226436,
                    "lng" : 72.573224
                 },
                 "html_instructions" : "Head on Swami Vivekananda RdRoad/Swami Vivekananda Rd",
                 "polyline" : {
                    "points" : "uqokCsa}yLS?GYEk@Cq@@qA@eA@aADm@"
                 },
                 "start_location" : {
                    "lat" : 23.0225066,
                    "lng" : 72.57129549999999
                 },
                 "travel_mode" : "DRIVING"
              }]`

我需要访问 routes.legs.steps.html_instructions。

所以我的代码如下

NSURL *url=[[NSURL alloc] initWithString:[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=ahmedabad&destination=%@",self.city]];`

NSURLResponse *res;
NSError *err;

NSData *data=[NSURLConnection sendSynchronousRequest:[[NSURLRequest alloc] initWithURL:url] returningResponse:&res error:&err];

NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

NSArray *routes=dic[@"routes"];
NSArray *legs=routes[0][@"legs"];
NSArray *steps=legs[0][@"steps"];
NSMutableArray *textsteps=[[NSMutableArray alloc] init];
NSMutableArray *latlong=[[NSMutableArray alloc]init];

for(int i=0; i< [steps count]; i++){
    NSString *html=steps[i][@"html_instructions"];
    [latlong addObject:steps[i][@"end_location"]];
    [textsteps addObject:html];
}
于 2014-12-26T12:14:39.203 回答