Iphone 从JSON在NSDictionary/NSArray中保持键的正确顺序

Iphone 从JSON在NSDictionary/NSArray中保持键的正确顺序,iphone,ios,objective-c,Iphone,Ios,Objective C,我有一个从请求返回的JSON数组。 数据来自外部源,不能从服务器更改: [{"clients": {"name":"Client name here","telephone":"00000","email":"clientemail@hotmail.com","website":"www.clientname.com"} }] 我按照这个顺序接收JSON数组 我有以下目标-C: //jsonString is the json string inside type NSString. NSMu

我有一个从请求返回的JSON数组。 数据来自外部源,不能从服务器更改:

[{"clients":
{"name":"Client name here","telephone":"00000","email":"clientemail@hotmail.com","website":"www.clientname.com"}
}]
我按照这个顺序接收JSON数组

我有以下目标-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);

            }
}
它打印密钥的顺序是: 电话 电子邮件 名称 网站

我需要打印它是如何接收的,例如: 名称 电话 电子邮件 网站

我读到字典是不按定义排序的,所以我很乐意使用数组而不是字典

[__NSArrayM allKeys]: unrecognized selector sent to instance 0x4b6beb0
但我在StackOverflow上看到了几个线程,它们都是关于使用keysSortedByValueUsingSelector的可能解决方案:

我试过了,但一无所获。不确定是不是我的实现错了

我尝试了尝试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);

            }
}
接收错误:[\uuu NSArrayM keySortedByValueUsingComparator:]:发送到实例的选择器无法识别

还尝试了尝试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中

如果您有任何想法,我们将不胜感激?
或者任何试图解决我的问题的代码片段都会得到同样的感谢。

首先,您看到的异常是因为选择器名称不正确。您应该使用keysSortedByValueUsingComparator。
其次,您不能对密钥进行排序,因为您从服务器获取密钥的顺序似乎没有任何特定的顺序。如果必须按该顺序排列,请使用标记索引从服务器发送,然后按此标记排序。

不仅NSDictionary原则上是无序的,JSON对象也是无序的。这些JSON对象是相同的:


如果服务器希望具有已排序的密钥,则需要发送一个数组。当然,您可以使用keysSortedByValueUsingComparator:方法按排序顺序获取密钥

我以为我在使用上面的“KeySortedByValue UsingComparator”?恐怕我无法修改他们是如何从服务器到达的。修复的任何代码片段都会很有用。您缺少一个“s”。这是键,不是键。如果你能解释为什么你必须遵守顺序,我可以帮助你找到解决方案。尝试使用Comparator和receive[\uu nsarray keys SortedByValue Using Comparator:]:未识别的选择器发送到instanceLook查看我对你问题的评论。客户端是数组还是字典?看起来好像客户端是NSArray,而您正试图在其上执行NSDictionary的选择器是的,我不明白它为什么会这样想。您可以看到上面的客户端是一个NSMutableDictionary。在启动客户端后放置一个断点,并在控制台中键入po clients。控制台显示的是什么类?括号中包含所有JSON。即使我使用NSMutableDictionary*客户端=[[NSMutableDictionary alloc]init]时也是如此;然后clients=[tempDict objectForKey:@clients];然后是一个数组。你能发布你正在解析的完整json吗?您问题中的json似乎不完整,因为它是一个数组。