0

我已经通过教程管理了在 obj-C 中发出 http 请求和解析 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 有关,但我不知道还能使用什么。

4

2 回答 2

1

AnNSDictionary只是键与值的关联。键/值对没有顺序。可能的解决方案:

  • 使用数组而不是字典作为 JSON 数据中的顶级对象。
  • 以可以排序的方式选择字典键。

添加

如果字典键是排序字符串,那么你可以这样做

int index = 0;
NSArray *sortedKeys = [[res allKeys] sortedArrayUsingSelector: @selector(compare:)];
for (NSString *key in sortedKeys) {
    index = index + 1;
    NSString  *value = [res objectForKey:key];
    /* ... */
}
于 2012-08-26T09:08:28.337 回答
1

没有简单的方法可以实现这一目标。正如 NSDictionary 的文档所述,字典中键的顺序是未指定的。如果您确实必须依赖项目的顺序,请使用 JSON 本身中的数组包装它们(在解析期间生成 NSArray),或者创建一个 NSDictionary 的子类,以使键顺序保持不变。

于 2012-08-26T09:08:58.580 回答