16

我有以下情况:

NSDictionary *params = @{
    @"Checkout" : @{
        @"conditions" : @{@"Checkout.user_id" : @1},
        @"order" : @{@"Checkout.id" : @"DESC"}
    },
    @"PaymentState" : @[],
    @"Offer" : @[]
};

此字典包含用于传递带有 Web 服务 URL 的 JSON 字符串的 Web 服务请求的参数。我使用 NSJSONSerialization 类获取 JSON 字符串,如下所示:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:0 error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

问题是: jsonString "keys" 的顺序与原始 params 字典键顺序不同,如下所示:

{
"Offer":[],
"PaymentState":[],
"Checkout":{
    "conditions":{"Checkout.user_id":6},
    "order":{"Checkout.id":"DESC"}
}

}

也就是说,“PaymentState”和“Offer”键首先出现在 jsonString 中,我需要保持原始顺序。这很重要,像这样:

{
"Checkout":{
    "conditions":{"Checkout.user_id":6},
    "order":{"Checkout.id":"DESC"}
},
"Offer":[],
"PaymentState":[]

}

所以伙计们,我该怎么做?

4

3 回答 3

10

每当我需要保持字典键的顺序时,我都会使用CocoaWithLove 中的 OrderedDictionary 。

基本上,OrderedDictionary其中包含一个NSMutableDictionary和一个NSMutableArray键,用于跟踪键的顺序。它实现了子类化所需的方法NSDictionary/NSMutableDictionary并且只是将方法调用“传递”到 internal NSMutableDictionary

于 2013-02-28T01:06:43.937 回答
10

根据JSON 规范,JSON 对象是特别无序的。每个 JSON 库都会考虑到这一点。因此,即使您暂时解决了这个问题,您几乎肯定会在以后遇到问题;因为您所做的假设不成立(键是有序的)。

于 2013-02-28T01:11:46.263 回答
7

虽然NSDictionary并且Dictionary不维护其键的任何特定顺序,但从 iOS 11 和 macOS 10.13 开始,通过指定选项JSONSerialization支持按字母顺序对键进行排序(请参阅 Apple 文档)。sortedKeys

例子:

let data: [String: Any] = [
    "hello": "world",
    "a": 1,
    "b": 2
]

let output = try JSONSerialization.data(withJSONObject: data, options: [.prettyPrinted, .sortedKeys])
let string = String(data: output, encoding: .utf8)

// {
//  "a" : 1,
//  "b" : 2,
//  "hello" : "world"
// }
于 2017-07-01T15:28:47.410 回答