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

これを達成する簡単な方法はありません。NSDictionary のドキュメントに記載されているように、辞書内のキーの順序は指定されていません。本当に項目の順序に依存する必要がある場合は、JSON 自体の配列を使用してそれらをラップする (解析中に NSArray になります) か、キーの順序を保持する NSDictionary のサブクラスを作成します。

于 2012-08-26T09:08:58.580 に答える
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 に答える