需要生成的JSON文档与在iOS中的NSMutableDictionary中插入的对象的顺序相同

我从一个NSMutableDictionary生成一个JSON文档,这个NSMutableDictionary是由指向NSString的键组成,还有两个键又指向其他NSMutableDictionary的键。 我的问题是,当我输出JSON文档时,我注意到JSON文档具有我以不同顺序插入到NSMutableDictionary中的对象。 例如,我目前的输出如下所示:

JSON Output: { "devicetype" : "iPhone Simulator", "os" : "6.0", "test_results" : [ { "date" : "2012-12-25T20:38:09", "name" : "Test 1", "result" : "Fail" }, { "date" : "2012-12-25T20:38:11", "name" : "Test 2", "result" : "Pass" }, { "date" : "2012-12-25T20:38:13", "name" : "Test 3", "result" : "Pass" }, { "date" : "2012-12-25T20:38:19", "name" : "Test 4", "result" : "Fail" } ], "devicename" : "?????", "reports" : [ ], "device_id" : "bb88413b178b4ef77830d385b9a4bd6d", "platform" : "iPhone OS" } 

但我希望输出如下所示:

 JSON Output: { "devicetype" : "iPhone Simulator", "os" : "6.0", "devicename" : "?????", "device_id" : "bb88413b178b4ef77830d385b9a4bd6d", "platform" : "iPhone OS" "test_results" : [ { "date" : "2012-12-25T20:38:09", "name" : "Test 1", "result" : "Fail" }, { "date" : "2012-12-25T20:38:11", "name" : "Test 2", "result" : "Pass" }, { "date" : "2012-12-25T20:38:13", "name" : "Test 3", "result" : "Pass" }, { "date" : "2012-12-25T20:38:19", "name" : "Test 4", "result" : "Fail" } ], "reports" : [ ], } 

我创buildJSON文档的代码如下所示:

 NSMutableArray* reports = [NSMutableArray array]; NSMutableArray* results = [NSMutableArray array]; for (TestResult *testObject in testResultArray) { if ([[DataModel sharedInstance] getScore:testObject.score] == @"Not Tested") { NSMutableDictionary *naTest = [NSMutableDictionary dictionary]; [naTest setObject:testObject.testName forKey:@"name"]; [naTest setObject:testObject.dateStamp forKey:@"date"]; [reports addObject:naTest]; } else { NSMutableDictionary *fullTest = [NSMutableDictionary dictionary]; NSString *score = [[DataModel sharedInstance] getScore:testObject.score]; [fullTest setObject:score forKey:@"result"]; [fullTest setObject:testObject.testName forKey:@"name"]; [fullTest setObject:testObject.dateStamp forKey:@"date"]; [results addObject:fullTest]; } } NSMutableDictionary *mainDoc = [NSMutableDictionary dictionary]; [mainDoc setObject:udid forKey:@"device_id"]; [mainDoc setObject:systemName forKey:@"platform"]; [mainDoc setObject:systemVersion forKey:@"os"]; [mainDoc setObject:@"?????" forKey:@"devicename"]; [mainDoc setObject:deviceType forKey:@"devicetype"]; [mainDoc setObject:results forKey:@"test_results"]; [mainDoc setObject:reports forKey:@"reports"]; NSError *ierror = nil; NSData *jsnData = [NSJSONSerialization dataWithJSONObject:mainDoc options:NSJSONWritingPrettyPrinted error:&ierror]; NSString *jsnString = [[NSString alloc] initWithData:jsnData encoding:NSUTF8StringEncoding]; NSLog(@"JSON Output: %@", jsnString); } 

我的另一个担心是,test_results的输出也不是按照我想要的顺序输出的。 他们按照“date”,“名称”,“结果”的顺序出来,我想输出是“名称”,“date”,“结果”。 有没有办法可以纠正这个问题呢?

NSDictionary不提供一个有序的存储容器 – 你可能应该首先研究如何呈现数据,即直接查询字典键来sortingNSDictionary,并将字典对象加载到NSArray中。

有很多关于NSDictionary内在缺乏“秩序”的信息。

这个SO问题提供了很多有用的解决scheme,例如使用具有有序字典类的外部库,以及使用SortDescriptors: Objective-C字典是一个有序的容器吗?

NSDictionary不保证键/值对的顺序(它不应该反正因为NSDictionary不是一个数组,它是一个查找表)。 如果你真的想要这个命令,最简单的方法是保持另一个数组周围的内容是字典的键按你想要的顺序存储。 当你解压JSON时,使用数组来查询字典。