2010-09-21 31 views
1

我有一个iPhone应用程序从服务器获取json字符串并对其进行解析。它包含一些数据,例如。一系列评论。但我注意到,当我分析它像这样JSON数组的顺序不会保留:Objective-C SBJSON:json数组的顺序

// parse response as json 
SBJSON *jsonParser = [SBJSON new]; 
NSDictionary *jsonData = [jsonParser objectWithString:jsonResponse error:nil]; 

NSDictionary* tmpDict = [jsonData objectForKey:@"rows"]; 
NSLog(@"keys coming!"); 
NSArray* keys = [tmpDict allKeys]; 
for (int i = 0;i< [keys count]; i++) { 
    NSLog([keys objectAtIndex:i]); 
} 

JSON结构:

{ 
   "pagerInfo":{ 

      "page":"1", 

      "rowsPerPage":15, 

      "rowsCount":"100" 

   }, 

   "rows":{ 

      "18545":{ 

         "id":"18545", 

         "text":"comment 1" 

      }, 

      "22464":{ 

         "id":"22464", 

         "text":"comment 2" 

      }, 

      "21069":{ 

         "id":"21069", 

         "text":"comment 3" 

      }, 

… more items 

   } 

} 

有谁知道如何解决这个问题?非常感谢!

回答

3

在您的示例JSON中没有数组,只有字典。在字典中,按照定义,键不以任何方式排序。所以,你要么需要改变产生JSON真正使用数组或按键排列在你的可可代码排序的代码,也许是这样的:

NSArray *keys = [[tmpDict allKeys] sortedArrayUsingSelector: @selector(compare:)]; 

使用排序键阵列可以再创建一个新的数组在正确的顺序中的对象:

NSMutableArray *array = [NSMutableArray arrayWithCapacity: [keys count]]; 
for (NSString *key in keys) { 
    [array addObject: [tmpDict objectForKey: key]]; 
} 
+0

谢谢,所以这个json中的ID必须被命令解决这个问题?有没有什么办法解析它,以便[arrayAfterSomeGreatFunction objectAtIndex:0]会返回“comment 1”字符串? – Cocoprogrmr 2010-09-21 10:02:01

+0

我编辑了我的答案,向您展示了一种可能的方式来创建具有排序对象的新数组。 – Sven 2010-09-21 10:39:29

0

Cocoprogrmr,

这里就是你需要做的:你已经分析出你的JSON字符串,并加载到这一个的NSArray(即,你必须NSArray中后*钥匙上面写的),从那里你可以将它放入一个循环,你遍历值在阵列。接下来,让你的嵌套的值,例如,获得行/文本的值,使用类似下面的语法:

for (NSDictionary *myKey in keys) 
{ 
    NSLog(@"rows/text --> %@", [[myKey objectForKey:@"rows"] objectForKey:@"text"]); 
} 

应该这样做。我的语法可能并不完美,但你明白了。

Andy