我有一个从请求返回的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代码片段尝试我的问题同样会受到赞赏。
答案 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”)的数据,然后按此标记排序。