在JDS的NSDictionary / NSArray中保持KEYS的正确ORDER

时间:2013-04-11 14:58:05

标签: iphone ios objective-c

我有一个从请求返回的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);

            }
}

它打印键的顺序是:
电话
电子邮件
命名
网站

我需要它来打印它是如何被接收的(例如):
命名
电话
电子邮件
网站

我已经读过字典按照定义没有排序,所以很高兴使用数组而不是字典。

但是我在StackOverflow上看到了关于可能的解决方案的几个线程(使用keysSortedByValueUsingSelector):
Getting NSDictionary keys sorted by their respective values
Can i sort the NSDictionary on basis of key in Objective-C?
sort NSDictionary keys by dictionary value into an NSArray
Can i sort the NSDictionary on basis of key in Objective-C?

我已经尝试过它们并且无处可去。不确定这只是我的实施是错误的。

我尝试过(尝试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

任何想法都会非常感激吗? 或者anybodies代码片段尝试我的问题同样会受到赞赏。

2 个答案:

答案 0 :(得分: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:方法即可按排序顺序获取密钥。

答案 1 :(得分:1)

首先,您看到的异常是因为选择器名称不正确。您应该使用keysSortedByValueUsingComparator。 其次,您无法对密钥进行排序,因为从服务器获取密钥的顺序似乎没有任何特定的顺序。如果必须按顺序使用它们,则从服务器发送带有标记(“index”)的数据,然后按此标记排序。