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);

            }
}

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

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

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

但是我在 StackOverflow 上看到了几个关于可能的解决方案的线程(使用keysSortedByValueUsingSelector):
Getting NSDictionary keys sorted by their different values
我可以根据 Objective-C 中的键对 NSDictionary 进行排序吗?
按字典值将 NSDictionary 键排序到 NSArray
我可以根据 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. 其次,您无法对密钥进行排序,因为您从服务器获取它们的顺序似乎没有任何特定的顺序。如果您必须按该顺序排列它们,则使用标签(“索引”)从服务器发送它们,然后按此标签排序。

于 2013-04-11T15:34:27.937 回答