我已经通过教程来管理http请求并解析obj-C中的json对象。不是我得到的数据我想将前17个保存到数组中,将项目从20-33保存到另一个。问题是数据的顺序与我在http请求中的顺序不同,但在另一个顺序中,所以我不能这样做,因为它们的顺序不一样。
这是我的代码:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"connectionDidFinishLoading");
NSLog(@"Succeeded! Received %d bytes of data",[self.responseData length]);
// convert to JSON
NSError *myError = nil;
NSDictionary *res = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:&myError];
NSMutableArray *array_1 = [NSMutableArray array];
NSMutableArray *array_2 = [NSMutableArray array];
int index=0;
// show all values
for(id key in res) {
index=index+1;
id value = [res objectForKey:key];
NSString *keyAsString = (NSString *)key;
NSString *valueAsString = (NSString *)value;
if (index<=17){
[array_1 addObject:valueAsString];
NSLog(@"%i: array 1 filling up: %@",index, keyAsString);
NSLog(@"%@",array_1);
} else if ((index>20)&&(index<=33)){
[array_2 addObject:valueAsString];
}
}
}
所以我希望我的数据与我在浏览器中运行脚本时的顺序相同。我想这与NSDictionary有关,但我不知道还有什么可以使用。
答案 0 :(得分:1)
NSDictionary
只是键与值的关联。键/值对没有顺序。可能的解决方案:
<强> ADDED 强>
如果字典键是排序字符串,那么你可以
int index = 0;
NSArray *sortedKeys = [[res allKeys] sortedArrayUsingSelector: @selector(compare:)];
for (NSString *key in sortedKeys) {
index = index + 1;
NSString *value = [res objectForKey:key];
/* ... */
}
答案 1 :(得分:1)
实现这一目标并非易事。正如NSDictionary的文档所述,字典中键的顺序是未指定的。如果你真的必须依赖项的顺序,要么使用JSON本身的数组包装它们(在解析期间产生NSArray),或者创建一个NSDictionary的子类,使得键顺序保持不变。