仅使用Swift 4 Codable对JSON数据内的数组进行解码

时间:2018-03-18 18:22:41

标签: swift swift4 codable

我正在使用Swift 4 Codable,我从我的网络服务中收到了这个JSON:

import Foundation

struct Employee: Codable {
    var id: Int
    var time: Date

    enum CodingKeys: String, CodingKey {
        case id = "id"
        case time = "time"
    }
}

我想只将员工数组解码为员工对象(时间属性只保存一次),但没有任何效果 我阅读了很多关于Swift 4 Alamofire.SessionManager.default.request(Router.syncUsers) .validate(contentType: ["application/json"]) .responseJSON { response in if response.response?.statusCode == 200 { guard let jsonDict = response as? Dictionary<String, Any>, let feedPage = Employee(from: jsonDict as! Decoder) else { return } guard let response = response.result.value as? [String: Any] else { return } guard let data = response["data"] as? [String: Any] else { return } guard let users = data["employees"] else { return } guard let usersData = try? JSONSerialization.data(withJSONObject: users, options: .prettyPrinted) else { return } guard let decoded = try? JSONSerialization.jsonObject(with: usersData, options: []) else { return } let decoder = JSONDecoder() guard let employee = try? decoder.decode(Employee.self, from: usersData) else { print("errorMessage") return } } else { print("errorMessage") } } 的资料,但是我不知道如何解码这个数组。

编辑:我的员工班:

{{1}}

请求:

{{1}}

2 个答案:

答案 0 :(得分:4)

使用Codable时,如果不解码外部数据,则无法解码内部数据。

但它非常简单,例如你可以省略所有CodingKeys。

struct Root : Decodable {
    let status : String
    let data : EmployeeData
}

struct EmployeeData : Decodable {
    let time : String
    let employees : [Employee]
}

struct Employee: Decodable {
    let id: Int
    let name: String
}
let jsonString = """
{
    "status": "success",
    "data": {
        "time": "00:02:00",
        "employees": [
            {"id": 1, "name": "foo"},
            {"id": 2, "name": "bar"}
        ]
    }
}
"""


do {
    let data = Data(jsonString.utf8)
    let result = try JSONDecoder().decode(Root.self, from: data)
    for employee in result.data.employees {
        print(employee.name, employee.id)
    }
} catch { print(error) }

答案 1 :(得分:1)

您可以使用quicktype轻松解决此类JSON解析问题。只需在左侧粘贴您的JSON,您就可以获得右侧的类型和序列化/反序列化代码,适用于各种语言。以下是它为您的JSON生成的类型:

struct Employees: Codable {
    let status: String
    let data: EmployeesData
}

struct EmployeesData: Codable {
    let time: String
    let employees: [Employee]
}

struct Employee: Codable {
    let id: Int
    let name: String
}