我正在学习如何解析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中的多维数组中解析信息。谢谢已经!
尼古拉斯
答案 0 :(得分: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结构格式不正确。
答案 1 :(得分:1)
有些事, 每次看到
{...}
是json,它是NSDictionary
一旦解析,而
[...]
是NSArray
的开头。
因此,一旦使用NSJSONSerialization
解析json,您就可以使用该知识导航该字典。
鉴于json,您必须获得"titreAlbum"
数组,您必须执行以下操作:
NSDictionary *albumVideo = json[@"Albumvideo"];
NSMutableArray *albumTitres = [[NSMutableArray alloc] init];
for (NSDictionary *album in albumVideo) {
[albumTitres addObject:album[@"titreAlbum"]];
}
那就是说,我认为你的json没有像传递JSONLint验证那样格式错误,但是没有帮助你解析它。我希望Albumvideo
是一个专辑数组,而不是专辑词典。
答案 2 :(得分: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];
}