需要生成的JSON文档与插入iOS的NSMutableDictionary中的对象的顺序相同 [英] Need JSON document that is generated to be in same order as objects inserted in NSMutableDictionary in iOS

查看:62
本文介绍了需要生成的JSON文档与插入iOS的NSMutableDictionary中的对象的顺序相同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在从NSMutableDictionary生成一个JSON文档,该文档由指向NSStrings的键以及依次指向其他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" : [

  ],
}

创建JSON文档的代码如下:

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的输出也没有按照我希望它们的顺序输出.它们以日期",名称",结果"的顺序出现,我希望输出为名称",日期",结果".有没有办法我也可以纠正此顺序?

解决方案

NSDictionary不提供有序的存储容器-您可能应该首先研究如何显示数据,即直接查询字典键以对NSDictionary进行排序,以及将字典对象加载到NSArray中.

关于NSDictionary固有的缺乏秩序"的信息很多.

这个SO问题提供了许多有用的解决方案,例如,使用具有顺序字典类的外部库,以及使用SortDescriptors: Objective-C词典是否是有序容器?

I am generating a JSON document from an NSMutableDictionary that is composed of keys that point to NSStrings, as well as two keys that point in turn to other NSMutableDictionary's. My problem is that when I output the JSON document, I notice that the JSON document has the objects that I inserted in the NSMutableDictionary in a different order. For example, my present output looks like this:

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"
}

but I want the output to look like this:

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" : [

  ],
}

The code that I have that creates the JSON document looks like this:

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


}

My other concern is that the output of the test_results are also not coming out in the order I want them to. They are coming out in the order "date", "name", "result", and I want the output to be "name", "date", "result". Is there a way that I can rectify this order as well?

解决方案

NSDictionary does not provide an ordered storage container - You should perhaps initially investigate how you present your data, i.e. querying directly for dictionary keys in order to sort your NSDictionary, as well as loading the dictionary objects into an NSArray(s).

There is plenty of information available on NSDictionary's inherent lack of 'order'.

This SO question provides lots of helpful solutions, such as using an external Library that has an ordered dictionary class, and using SortDescriptors: Is the Objective-C dictionary an ordered container?

这篇关于需要生成的JSON文档与插入iOS的NSMutableDictionary中的对象的顺序相同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆