来自 JSON,ios,swift,decodable"/>

首页 > 解决方案 > 解码 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响应不可能变成一个数组,是的,它总是相同的顺序。

标签: iosswiftdecodable

解决方案


Swift、JSON 字典都是unordered天生的。JSON 格式不维护键顺序,因此不需要解析器来保留顺序。

如果您需要一个有序集合,最好在 JSON 中返回一个键值对数组

 {
    "persons": [
        { "John": {
            "name": "John",
            "age": 24
          }
        },
        {"Michael": {
            "name": "Michael",
            "age": 44
          }
        },
       { "Jack": {
            "name": "Jack",
            "age": 25
         }
       }
    ]
}

推荐阅读