3

NSStringsを指すキーと他のNSMutableDictionaryを指す2つのキーで構成されるNSMutableDictionaryからJSONドキュメントを生成しています。私の問題は、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の出力も私が望む順序で出てこないことです。それらは「日付」、「名前」、「結果」の順序で出てきます。出力を「名前」、「日付」、「結果」にします。この注文も修正する方法はありますか?

4

2 に答える 2

3

NSDictionary は順序付けられたストレージ コンテナーを提供しません - おそらく最初に、データの表示方法を調査する必要があります。つまり、NSDictionary を並べ替えるために辞書キーを直接クエリしたり、辞書オブジェクトを NSArray にロードしたりします。

NSDictionary 固有の「順序」の欠如に関する情報はたくさんあります。

この SO の質問は、順序付けられた辞書クラスを持つ外部ライブラリの使用や、SortDescriptors の使用など、多くの役立つ解決策を提供します。 目的の C 辞書は順序付けられたコンテナーですか?

于 2012-12-26T02:23:39.737 に答える
1

NSDictionaryは、キーと値のペアの順序を維持することを保証しません(NSDictionaryは配列ではなく、ルックアップテーブルであるため、とにかくそうすべきではありません)。これを本当に順序付けたい場合、最も簡単な方法は、内容が目的の順序で格納された辞書のキーである別の配列を保持することです。また、JSONを解凍するときは、配列を使用して辞書をクエリします。

于 2012-12-26T02:09:13.767 に答える