Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从JSON在NSDictionary/NSArray中保持键的正确顺序_Iphone_Ios_Objective C - Fatal编程技术网

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

Iphone 从JSON在NSDictionary/NSArray中保持键的正确顺序,iphone,ios,objective-c,Iphone,Ios,Objective C,我有一个从请求返回的JSON数组。 数据是这样的(它来自外部源,不能从服务器更改): 我按照这个顺序接收JSON数组 我有以下目标-C: //jsonString is the json string inside type NSString. NSMutableDictionary *tempDict = [jsonString JSONValue]; NSMutableDictionary *clients = [tempDict objectForKey:@"clients"]; for

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

我按照这个顺序接收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):

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

也尝试过(尝试2):

但选择器上还有一个错误,即使客户端是NSMutableDictionary

[__NSArrayM allKeys]: unrecognized selector sent to instance 0x4b6beb0
我正处于这样一个时刻,我想我将迭代
NSMutableDictionary
,并以正确的顺序手动将它们放入一个新的
NSMutableArray

如果您有任何想法,我们将不胜感激。

或者任何试图解决我的问题的代码片段都会得到同样的感谢。

首先,您看到的异常是因为选择器名称不正确。您应该使用Comparator使用
键SortedByValue

其次,您不能对密钥进行排序,因为您从服务器获取密钥的顺序似乎没有任何特定的顺序。如果必须按该顺序排列,则从服务器发送带有标记(“索引”)的数据,然后按此标记排序。

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


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

我以为我在使用上面的“KeySortedByValue UsingComparator”?恐怕我无法修改他们是如何从服务器到达的。修复的任何代码片段都会很有用。您缺少一个“s”。这是键,不是键。如果你能解释为什么你必须遵守顺序,我可以帮你找到一个解决方案。试过
keysortedbyvalueusingcomparator
并收到
[\uu NSArrayM keysortedbyvalueusingcomparator:]:未识别的选择器发送到实例查看我对你问题的评论。
clients
是数组还是字典?看起来好像
clients
是一个
NSArray
并且您试图在其上执行
NSDictionary
的选择器是的,我不明白它为什么会这样想。您可以看到上面的
clients
是一个
NSMutableDictionary
。在启动
clients
后放置一个断点,并在控制台中键入
poclients
。控制台显示的是什么类?显示的是
()
,括号内包含所有JSON。即使我使用
NSMutableDictionary*客户端=[[NSMutableDictionary alloc]init]时也是如此然后<代码>客户端=[tempDict objectForKey:@“客户端”]然后它是一个数组。你能发布你正在解析的完整json吗?您问题中的json似乎不完整,因为它是一个数组。
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
}
[__NSArrayM allKeys]: unrecognized selector sent to instance 0x4b6beb0
[{"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"}
}]