2014-02-23 66 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

如果对方要求输入一定的顺序它可能也会做很多其他的事情。 –