【发布时间】:2018-02-27 00:09:06
【问题描述】:
我有一个简单的 JSON 对象:
{
"values": {
"a":"",
"b":"",
"c":"",
"d":"",
"e":""
}
}
我想以这样的方式将它解码为 Swift 结构,以后我可以以与收到 JSON 对象完全相同的顺序迭代 values 中的键.
这在 Swift 中可行吗?
我的尝试如下:
let json = "{ \"values\": { \"a\":\"\", \"b\":\"\", \"c\":\"\", \"d\":\"\", \"e\":\"\" } }"
struct JSS: Codable {
var values: [String: String?]?
}
let data = json.data(using: .utf8)
do {
let decoder = JSONDecoder()
let jss = try decoder.decode(JSS.self, from: data!)
jss.values?.map { print("\($0.key)") }
}
catch {
}
将打印:
b
e
a
d
c
【问题讨论】:
-
JSON 字典按照定义是无序的,Swift 字典也是如此。根据 JSON 标准,在对 JSON 进行编码/解码时,不需要保留 Dictionary 内的顺序,因此您看到的是预期的行为。
-
如果您需要按字母顺序迭代您的键,只需按其键对已解析的字典进行排序。我认为不可能得到与它相同的订单。
-
顺便说一句,您可以使用三重双引号来更轻松地表示您的 JSON 字符串,而无需转义特殊字符
let json = """ { "values": { "a":"", "b":"", "c":"", "d":"", "e":"" } } """