Swift json解码丢失json对象密钥顺序
我有一个简单的JSON对象:Swift json解码丢失json对象密钥顺序,json,swift,Json,Swift,我有一个简单的JSON对象: { "values": { "a":"", "b":"", "c":"", "d":"", "e":"" } } 我想把它解码成一个Swift结构,这样我以后就可以在值中按与接收JSON对象完全相同的顺序迭代键了 这在Swift中可能吗 我的尝试如下: let json = "{ \"values\": { \"a\":\"\", \"b\":\"\", \"c\":
{
"values": {
"a":"",
"b":"",
"c":"",
"d":"",
"e":""
}
}
我想把它解码成一个Swift结构,这样我以后就可以在值
中按与接收JSON对象完全相同的顺序迭代键了
这在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
这本身并不是一个快速的限制。Swift和JSON字典都是无序的。JSON格式不保证密钥顺序,因此不需要解析器来保持顺序 如果需要有序集合,最好在JSON中返回键值对数组:
{
"values": [
{"a" : ""},
{"b" : ""},
{"c" : ""},
{"d" : ""},
{"e" : ""}
]
}
然后按正确的顺序存储密钥,以便能够根据需要对其进行迭代。以下操作无效,因此您不必浪费时间尝试:
回到旧的方式,使用JSONSerialization.jsonObject(with:Data,options:JSONSerialization.ReadingOptions)->Any
它确实维持秩序直到您将json?[“值”]
转换为[字符串:任意]
。此时,塞扎在上面所说的话进入了人们的视野:字典是无序的
下面的屏幕截图显示,除非json?[“values”]
是Any
,否则顺序将保留在字符串描述中
JSON字典按定义是无序的,Swift字典也是如此。根据JSON标准,在编码/解码JSON时,不需要保留字典内的顺序,因此您看到的是预期的行为。如果需要按字母顺序迭代键,只需按键对已解析的字典进行排序。我认为不可能得到相同的顺序。顺便说一句,您可以使用三重双引号来更容易地表示JSON字符串,而不必转义特殊字符
let JSON=“”{”value:{”a:“,”b:“,”c:“,”d:“,”e:“}”“,
回答得好。(投票)不幸的是,许多JSON解析器确实保留了列表中键/值对的顺序,因此开发人员编程依赖于它,尽管正如您所说,这并不能保证。请注意,在编码JSON编码器时,您可以按字典顺序对键进行排序。