ios - 解码 KeyValuePairs来自 JSON
问题描述
我有一个看起来像这样的 JSON 响应:
{
"persons": {
"John": {
"name": "John",
"age": 24
},
"Michael": {
"name": "Michael",
"age": 44
},
"Jack": {
"name": "Jack",
"age": 25
}
}
}
如您所见,这可以使用如下所示的结构进行解析:
struct PersonsResponse: Decodable {
let persons: [String: Person]
}
struct Person: Decodable {
let name: String
let age: Ing
}
但是,它的作用是返回一个字典并很好地解析。我需要的是在人员到达此 JSON 响应时保留他们的顺序。我很快就遇到KeyValuePairs
了基本上是有序的字典,但是看在上帝的份上,我不知道如何将它解码为KeyValuePairs<String, Person>
.
Apple 文档说实例化一个KeyValuePairs
对象很简单:
let recordTimes: KeyValuePairs = ["Florence Griffith-Joyner": 10.49,
"Evelyn Ashford": 10.76,
"Evelyn Ashford": 10.79,
"Marlies Gohr": 10.81]
字面上地。但是当我解码我的回复时:
struct PersonsResponse: Decodable {
let persons: KeyValuePairs<String, Person>
...
...
init(from decoder: Decoder) throws {
...
let personsDictionary = try container.decode([String: Person].self, forKey: .persons)
然后尝试做:
persons = personsDictionary
当然它根本不起作用。我已经尝试过各种魔法,但没有运气。有没有人有任何解决方案将字典解析为有序序列甚至数组?感谢您的帮助!
JSON响应不可能变成一个数组,是的,它总是相同的顺序。
解决方案
Swift、JSON 字典都是unordered
天生的。JSON 格式不维护键顺序,因此不需要解析器来保留顺序。
如果您需要一个有序集合,最好在 JSON 中返回一个键值对数组
{
"persons": [
{ "John": {
"name": "John",
"age": 24
}
},
{"Michael": {
"name": "Michael",
"age": 44
}
},
{ "Jack": {
"name": "Jack",
"age": 25
}
}
]
}