2

リクエストから返された JSON 配列があります。
データはそのままです(外部ソースから取得され、サーバーから変更することはできません):

[{"clients":
{"name":"Client name here","telephone":"00000","email":"clientemail@hotmail.com","website":"www.clientname.com"}
}]

この順番で JSON 配列を受け取ります。

以下のObjective-Cがあります:

//jsonString is the json string inside type NSString.
NSMutableDictionary *tempDict = [jsonString JSONValue];
NSMutableDictionary *clients = [tempDict objectForKey:@"clients"];

for(NSString *key in clients) {
        id value = [tempDict objectForKey:key]; 
            for(NSString *itemKey in key) {
                NSLog(@"ITEM KEY %@: ",itemKey);

            }
}

キーを印刷する順序は次のとおりです。
電話、
電子メール、
名前、
Web サイト

受信方法を印刷するために必要です (例):
名前
電話
メール
ウェブサイト

辞書は定義上ソートされていないことを読んだので、辞書の代わりに配列を使用して喜んでいます。

しかし、考えられる解決策に関して、StackOverflow でいくつかのスレッドを見てきました (を使用keysSortedByValueUsingSelector):それぞれの値でソート
された NSDictionary キーの取得 Objective-C でキーに基づいて NSDictionary を並べ替えることはできますか?



私はそれらを試しましたが、どこにも行きません。間違っているのは私の実装だけかどうかはわかりません。

私が試した(試行1):

NSArray *orderedKeys = [clients keySortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [obj1 compare:obj2];
}];

for(NSString *key in orderedKeys) {
        id value = [tempDict objectForKey:key]; 
            for(NSString *keyThree in key) {
                NSLog(@"API-KEY-ORDER %@: ",keyThree);

            }
}

受信エラー: [__NSArrayM keySortedByValueUsingComparator:]: unrecognized selector sent to instance

また試してみました(試行2):

NSArray *sortedKeys = [[clients allKeys] sortedArrayUsingSelector: @selector(compare:)];
NSMutableArray *sortedValues = [NSMutableArray array];
for (NSString *key in sortedKeys){
    [sortedValues addObject: [tempDict objectForKey: key]];
    //[sortedValues addObject: [all objectForKey: key]]; //failed
}

ただし、クライアントが NSMutableDictionary であっても、セレクターで別のエラーが発生します。

[__NSArrayM allKeys]: unrecognized selector sent to instance 0x4b6beb0

私は、 を反復処理し、NSMutableDictionaryそれらを手動でNSMutableArray正しい順序で新しいものに配置しようと考えているところです。

どんなアイデアでも大歓迎ですか?
または、私の問題に対するコードスニペットの試みも同様に高く評価されます。

4

2 に答える 2

2

NSDictionary は原則として順不同であるだけでなく、JSON オブジェクトも順不同です。これらの JSON オブジェクトは同一です:

[{"clients":
{"name":"Client name here","telephone":"00000","email":"clientemail@hotmail.com","website":"www.clientname.com"}
}]

[{"clients":
{"website":"www.clientname.com","name":"Client name here","telephone":"00000","email":"clientemail@hotmail.com"}
}]

サーバーが順序付けされたキーを持ちたい場合は、配列を送信する必要があります。もちろん、keysSortedByValueUsingComparator: メソッドを使用して、ソートされた順序でキーを取得できます。

于 2014-04-04T17:53:39.977 に答える
1

まず、表示されている例外は、セレクター名が正しくないためです。を使用する必要がありますkeysSortedByValueUsingComparator。2 つ目は、キーをサーバーから取得する順序が特定の順序でないように見えるため、キーを並べ替えることができないことです。それらをその順序で保持する必要がある場合は、サーバーからタグ (「インデックス」) を付けて送信し、このタグで並べ替えます。

于 2013-04-11T15:34:27.937 に答える