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"}
}

}

つまり、jsonStringでは「PaymentState」キーと「Offer」キーが最初に来るので、元の順序を維持する必要があります。これは、次のように非常に重要です。

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

}

だからみんな、どうすればそれができますか?

4

3 に答える 3

10

辞書キーの順序を維持する必要があるときはいつでも、CocoaWithLove の OrderedDictionaryを使用します。

基本的に、キーの順序を追跡するために、その中にキーのとOrderedDictionaryが含まれています。/をサブクラス化するために必要なメソッドを実装し、メソッド呼び出しを internal に「渡す」だけです。NSMutableDictionaryNSMutableArrayNSDictionaryNSMutableDictionaryNSMutableDictionary

于 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 に答える