3

サーバーから 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 ファイルと同じ順序でキーを保持する必要がありますが、返された NSDictionary を で列挙すると[dict allKeys]、次のようにキーが乱れます。

fourth key    
second key    
first key    
third key

私も使用しようとしまし[dict keyEnumerator]たが、結果はまったく同じです。

キーを JSON ファイルと同じ順序に保つ方法はありますか?

4

1 に答える 1

2

Cocoa の NSDictionary は要素の順序を保持しません。そのため、AFJSONResponseSerializer を使用すると、JSON ファイルと同じ順序でキーを保持することはできません。NSArray を使用するには、JSON を自分で解析するか、JSON 構造を変更する必要があります。

例えば:

{
    [
        {"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]}
     ]
}

アップデート:

このスレッドは、[NSJSONSerialization dataWithJSONObject:] を使用して NSData に変換するときに NSDictionary キーの順序を維持するのに役立ちます。

于 2014-03-18T14:23:30.153 に答える