Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AFJSONResponseSerializer之后JSON NSDictionary无序_Ios_Objective C_Json_Nsdictionary_Afhttprequestoperation - Fatal编程技术网

Ios AFJSONResponseSerializer之后JSON NSDictionary无序

Ios AFJSONResponseSerializer之后JSON NSDictionary无序,ios,objective-c,json,nsdictionary,afhttprequestoperation,Ios,Objective C,Json,Nsdictionary,Afhttprequestoperation,我有以下代码从服务器下载JSON文件: - (void) queryAPI:(NSString*)query withCompletion:(void (^) (id json))block{ NSURL *URL = [NSURL URLWithString:@"http://myAPI.example/myAPIJSONdata"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; AFHTTPRe

我有以下代码从服务器下载JSON文件:

- (void) queryAPI:(NSString*)query withCompletion:(void (^) (id json))block{
    NSURL *URL = [NSURL URLWithString:@"http://myAPI.example/myAPIJSONdata"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    op.responseSerializer = [AFJSONResponseSerializer serializer];
    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        block(responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        block(nil);
    }];
    [[NSOperationQueue mainQueue] addOperation:op];
}
JSON文件如以下示例所示:

{
    "dict":{
        "first key": [val1, val2, val3],
        "second key": [val1, val2, val3],
        "third key": [val1, val2, val3],
        "fourth key": [val1, val2, val3]
     }
}
我需要保持键在JSON文件中的顺序不变,但是当我使用
[dict allKeys]
枚举返回的NSDictionary时,键会被打乱,如下所示:

fourth key    
second key    
first key    
third key
我还尝试使用
[dict keyEnumerator]
,但结果完全相同


有没有办法保持键在JSON文件中的顺序不变?

Cocoa中的NSDictionary不保持元素的顺序。因此,使用AFJSONResponseSerializer不可能将密钥保持在JSON文件中的相同顺序。您必须自己解析JSON或更改JSON结构以使用NSArray

例如:

{
    [
        {"name" : "first key", "value" : [val1, val2, val3]},
        {"name" : "second key", "value" : [val1, val2, val3]},
        {"name" : "third key", "value" : [val1, val2, val3]},
        {"name" : "fourth key", "value" : [val1, val2, val3]}
     ]
}
更新:


此线程可能对您有用

字典不需要“排序”,因为它不是数组,它与键/值系统一起工作。好的,我理解这一点。但我如何才能以相同的顺序获得密钥?您需要在数组中存储已排序的项。这个问题已被问了很多次。。。字典是无序的集合。故事结束了。数组是有序集合。我同意,在这种情况下,我不需要字典,因为我可以更改Web服务以返回数组并解决此问题,但在某些情况下,您需要在字典上保持插入顺序。其他实现(例如PHP)保存插入顺序并按此顺序枚举。拥有此功能有什么问题?可能取决于实现。在objective C中,字典是无序的。你是对的。我还使用
[NSJSONSerialization JSONObjectWithData:jsontext]
尝试了相同的JSON数据,结果类似,也很混乱。我可以更改JSON,但我希望避免这种情况,因为其他人已经在使用这个文件了…这个线程对你来说可能很有趣是的,它真的很有趣。Cocoa with love实现的类与PHP实现的思想完全相同。可惜JSON序列化程序没有使用这样的东西。我确信我必须更改Web服务以使用数组。如果元素的顺序对您很重要,那么是的。你需要发送一个数组。array/NSArray是有序集合,object/NSDictionary是无序集合。