【问题标题】:JSON format: getting output in the correct order [duplicate]JSON格式:以正确的顺序获取输出[重复]
【发布时间】:2014-02-23 19:35:02
【问题描述】:

常见任务,将字符串转换为 JSON 格式。是的,很简单,StackOverflow 上有很多关于这个的答案。

对我来说不太容易理解的是为什么我得到的顺序与我将 pair 对象放入 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

【问题讨论】:

  • 通常使用字典,顺序无关紧要,因为您将通过键访问值。您能否扩展需要键项的顺序一致的用例?
  • 不保证保留 JSON“对象”中键/值对的顺序。
  • 来自 json.org:“一个对象是一组 无序 名称/值对。”

标签: ios objective-c json nsdictionary nsdata


【解决方案1】:

NSDictionary 中的键/值对没有顺序。您可以按该顺序添加它们,但字典中不会保留任何顺序信息。因此,当您创建 JSON 时,它会以任意顺序出现。

如果您需要按特定顺序的内容,那么您不应该使用字典,或者您应该按照您想要的顺序将项目流式传输到 JSON 中(例如,使用SBJson4StreamWriter)。

【讨论】:

  • 当然,另一端的解析器也不保证保持顺序。 JSON“对象”中的条目应该被认为是无序的。
  • @HotLicks,我同意他们应该(被认为是无序的),但有时您需要与对订单赋予意义的另一方整合 - 这总是很有趣......
  • 如果对方要求按一定顺序输入条目,那么它可能也做错了很多其他事情。
  • 感谢您的回答 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多