仅使用Swift 4 Codable解码JSON数据中的数组

chr0x

我正在使用Swift 4,Codable并且正在从Web服务接收以下JSON:

{
    "status": "success",
    "data": {
        "time": "00:02:00",
        "employees": [
            {
                "id": 001,
                "name": "foo"
            }, 
            {
                "id": 002,
                "name": "bar"
            }
        ]
    }
}

我只想将employee数组解码为员工对象(time属性将仅保存一次),但没有任何效果。
我读了很多有关Swift 4的资料,Codable但不知道如何解码该数组。

编辑:我的员工班级:

import Foundation

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

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

要求:

  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")
                }
        }
瓦迪安

使用时,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) }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章