Rod*_*les 15 cocoa-touch objective-c ios
我有以下情况:
NSDictionary *params = @{
@"Checkout" : @{
@"conditions" : @{@"Checkout.user_id" : @1},
@"order" : @{@"Checkout.id" : @"DESC"}
},
@"PaymentState" : @[],
@"Offer" : @[]
};
Run Code Online (Sandbox Code Playgroud)
此字典包含传递带有Web服务URL的JSON字符串的Web服务请求的参数.我使用NSJSONSerialization类获取JSON字符串,如下所示:
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:0 error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)
问题是:jsonString"keys"的顺序与原来的params字典键顺序不同,如下所示:
{
"Offer":[],
"PaymentState":[],
"Checkout":{
"conditions":{"Checkout.user_id":6},
"order":{"Checkout.id":"DESC"}
}
Run Code Online (Sandbox Code Playgroud)
}
也就是说,"PaymentState"和"Offer"键首先出现在jsonString中,我需要保持原始顺序.这非常重要,如下:
{
"Checkout":{
"conditions":{"Checkout.user_id":6},
"order":{"Checkout.id":"DESC"}
},
"Offer":[],
"PaymentState":[]
Run Code Online (Sandbox Code Playgroud)
}
那么伙计们,我怎么能这样做?
小智 10
每当我需要保持字典键的顺序时,我就使用CocoaWithLove中的OrderedDictionary.
基本上,OrderedDictionary包含一个NSMutableDictionary和一个NSMutableArray用于其中的键,以跟踪键的顺序.它实现了子类化所需的方法NSDictionary/ NSMutableDictionary并且只是将方法调用"传递"到内部NSMutableDictionary.
Me1*_*000 10
根据JSON规范,JSON对象是特定无序的.每个JSON库都会考虑到这一点.因此,即使你现在解决这个问题,你几乎肯定会在以后遇到问题; 因为你做的假设不成立(按键是有序的).
虽然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"
// }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11717 次 |
| 最近记录: |