如何使用Swift 4.2将具有可编码结构的JSON响应加载到tableview中?

时间:2019-02-19 15:05:56

标签: ios json swift tableview

我的情况是,我正在尝试为Codable响应创建JSON。我已经完成了codable的结构,但不知道如何将其load转换为tableview。在这里,每当我选择多个tableview单元格时,都需要获取所有选定的单元格数据username和用户ID。我不知道如何开始,请给我一些建议。

我的回应

{
    "status": 200,
    "user_list": [
        {
            "user_id": “1234”,
            "permission": 1,
            "active": 1,
            "user": {
                "firstname": “jack”,
                "lastname": “m”
            }
        },etc,...
        ]
}

我的可编码伙伴

struct Welcome: Codable {
    let status: Int
    let userList: [UserList]

    enum CodingKeys: String, CodingKey {
        case status
        case userList = "user_list"
    }
}

struct UserList: Codable {
    let userID: String
    let permission, active: Int
    let user: User

    enum CodingKeys: String, CodingKey {
        case userID = "user_id"
        case permission, active, user
    }
}

struct User: Codable {
    let firstname, lastname: String
}

2 个答案:

答案 0 :(得分:3)

首先,我将您的UserList模型重命名为UserUser仅重命名为Name(然后将该属性重命名为name ...然后可以重命名{ {1}}的属性)

Name

那么我认为在您的情况下,struct Welcome: Codable { // you can avoid using `CodingKeys` here since you can let status: Int // set `keyDecodingStrategy` of decoder which does work let userList: [User] // for you } struct User: Codable { let userId: String let permission, active: Int let name: Name enum CodingKeys: String, CodingKey { case name = "user" case permission, active, userId } } struct Name: Codable { let first, last: String } 的数据源数组应该只包含用户,因此...您的UITableView模型。

User

然后,您可以将此数组分配为解码后的响应的var users = [User]() 属性

userList

现在,对于确定行数的do { let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase let decoded = try decoder.decode(Welcome.self, from: someData) self.users = decoded.userList } catch { print(error) } 数据源方法,使用用户数

UITableView

,对于func numberOfSections(in tableView: UITableView) -> Int { return users.count } ,请使用特定用户

cellForRowAt

答案 1 :(得分:0)

您的API调用应返回一个Data对象。要解析它,您可以使用:

 func parseWelcome(dataFromServer:Data,handlerDone: @escaping (_ welcome:Welcome) ->Void) ->Void {
    do {
        let welcome = try JSONDecoder().decode(Welcome.self, from:jsonData!)
        handlerDone(welcome)
    } catch {

        // A handler could be defined here for handeling bad response from server
        print("API:An error occurred while parsing server response Welcome")
    }
}

调用该函数并从服务器传递您的rawData。我断定您在某个地方有一个User数组,所以让我们填充

parseWelcome(dataFromServer: rawData!) { parsedData in

   // Users should be an Array of Users defined by you somewhere
   users = parsedData.userList
}

调用tableView并从用户数组中加载数据

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // create a new cell if needed or reuse an old one
        let cell = tableView.dequeueReusableCell(withIdentifier: "notes", for: indexPath)

        // Construct your cell on your needs use users[indexPath.row]
        ...
}

但是我同意@Robert Dresler的观点,您的模型设计不正确。建议重新设计一下。