2014-02-23 71 views
1

常見任務,將字符串轉換爲JSON格式。是的,簡單,在StackOverflow上有關於此的大量答案。JSON格式:以正確的順序獲取輸出

有什麼不容易理解的是爲什麼我得到的順序不同於我把對象放在NSDictionary中的順序。

這是我寫的代碼:

-(NSString*)createJSONstring 
{ 
    //http://www.raywenderlich.com/5492/working-with-json-in-ios-5 
    NSDictionary* dictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
           @"<xx3-xxxx>",@"from", 
           @"<xxx-xxx>",@"to", 
           @"<Bla bla bla>",@"message", 
           @"<2000>",@"posixtime", nil]; 

    NSArray* notifications = [NSArray arrayWithObjects:dictionary, nil]; 

    NSError *writeError = nil; 
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError]; 
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    NSLog(@"JSON Output: %@", jsonString); 

    return jsonString; 
} 

我希望得到的東西是這樣的:

{ 
    "from" : "<xx3-xxxx>" 
    "to" : "<xxx-xxx>", 
    "message" : "<Bla bla bla>", 
    "posixtime" : "<2000>", 
    } 

但我得到一個不同的順序:

{ 
    "posixtime" : "<2000>",  <----- INCORRECT 
    "to" : "<xxx-xxx>", 
    "message" : "<Bla bla bla>", 
    "from" : "<xx3-xxxx>"   <----- INCORRECT 
    } 

哪有我按照插入數組的順序獲得輸出結果?

[NSDictionary dictionaryWithObjectsAndKeys:     //I want it to be: 
            @"<xx3-xxxx>",@"from",   //1st 
            @"<xxx-xxx>",@"to",   //2nd 
            @"<Bla bla bla>",@"message", //3rd 
            @"<2000>",@"posixtime", nil]; //4th 
+1

通常,使用字典時,順序無關緊要,因爲您可以通過鍵訪問值。你能否擴展需要鍵控項目一致的用例? – GnarlyDog

+0

JSON「對象」中的鍵/值對的順序不保證保留。 –

+0

來自json.org:「一個對象是一個*無序的*一組名稱/值對。」 –

回答

3

NSDictionary中的鍵/值對沒有順序。您可以按照該順序添加它們,但字典中沒有訂單信息。所以,當你創建JSON時,它會以任意順序出現。

如果您需要特定順序的內容,那麼您應該不使用字典,或者按照所需的順序(例如,使用SBJson4StreamWriter)將項目串流到JSON中。

+1

當然,另一端的解析器也不保證維持順序。 JSON「對象」中的條目應被視爲無序。 –

+0

@HotLicks,我同意他們應該(被認爲是無序的),但有時你需要與已賦予訂單含義的另一方進行整合 - 這總是很有趣... – Wain

+1

如果對方要求輸入一定的順序它可能也會做很多其他的事情。 –