Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift json解码丢失json对象密钥顺序_Json_Swift - Fatal编程技术网

Swift 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\":

我有一个简单的JSON对象:

{
    "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编码器时,您可以按字典顺序对键进行排序。