像许多键值存储类一样,NSDictionary
不保证您添加的元素的顺序。假设键/值对或键集将以任何特定顺序返回是错误的。
此外,JSON 对象以相同的方式无序。您不应该关心添加对象的顺序。您(或您的接收者)也不应该依赖提供带有“排序”键的 JSON 对象,因为对于这些特定结构来说,这并不是一个真正有效的概念。虽然对键排序可能会导致迭代器按照您期望的顺序遍历键,但这不是保证,也不应该依赖。
我认为你应该重新审视为什么首先需要对键进行排序,看看你是否能找到一种方法来避免依赖于它们的字母顺序。
编辑:您提到服务器需要JSON 字符串的 SHA 哈希。如果必须,您可以通过对 中的键进行排序来创建排序的 JSON 字符串NSMutableArray
,然后从这些键创建 JSON 字符串。
NSMutableArray *sortedKeys = [NSMutableArray arrayWithArray:[myDict allKeys]];
[sortedKeys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
NSMutableString *jsonString = [[NSMutableString alloc] init];
[jsonString appendString:@"{"];
for (NSString *key in sortedKeys) {
[jsonString appendFormat:@"\"%@\"", key];
[jsonString appendString:@":"];
[jsonString appendFormat:@"\"%@\"", [myDict objectForKey:key]];
[jsonString appendString:@","];
}
if ([jsonString length] > 2) {
[jsonString deleteCharactersInRange:NSMakeRange([jsonString length] - 1, 1)];
}
[jsonString appendString:@"}"];
此代码尚未经过测试,因此您可能需要稍微尝试一下。认为如果您能找到一个 JSON 库来为您执行此操作会更好,尽管您可能无法对密钥排序进行太多控制。