arrays - 使 JSON 响应符合结构和数组 Swift

标签 arrays json swift httpresponse decoding

目前,我有一个名为 User 的结构,它定义了我要从 HTTP 响应中解码的变量。然后,我有一个名为 users 的数组,它将包含响应。如您所见,我在 random8 函数中填充用户,但现在在 random1 函数中我遇到了问题。在 random1 函数中,我只得到 1 个用户而不是 8 个,我正在尝试获取该数据并用该新数据替换当前用户之一。我能够在我的代码中成功地做到这一点(通过提取每个值),但我很确定我没有以标准方式做到这一点。如果有更好的方法,请告诉我。

请记住,random8 是在 viewDidLoad 上调用的,而 random1 稍后会在他们点击特定按钮时发生,因此我将替换一个特定用户索引的数据。

 struct User: Decodable {
    var id: Int
    var first_name: String
    var last_name: String
    var picture_url: String
    var points: Int
    var school: String
    var grade: Int
}

 var users = [User]()

func getRandom8() {
    let url = URL(string: "https://somewebsite.com/users/random/eight")
    let session = URLSession.shared

    let request = NSMutableURLRequest(url: url!)
    let preferences = UserDefaults.standard
    request.addValue("JWT \(preferences.object(forKey: "token") as! String)", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "GET"

    let task = session.dataTask(with: request as URLRequest, completionHandler: {
        (data, response, error) in
        do {
            self.users = try JSONDecoder().decode([User].self, from: data!)

            DispatchQueue.main.async (
                execute: self.loadRandom8
            )

        } catch {
            print("error in getting data")
        }
    })

    task.resume()

}

func getRandom1(index:Int) {
    let url = URL(string: "https://somewebsite.com/users/random/one")
    let session = URLSession.shared

    let request = NSMutableURLRequest(url: url!)
    let preferences = UserDefaults.standard
    request.addValue("JWT \(preferences.object(forKey: "token") as! String)", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "GET"
    //write a statement that says if that user is already there, do the call again
    let task = session.dataTask(with: request as URLRequest, completionHandler: {
        (data, response, error) in

        do {
            let responseObject = (try? JSONSerialization.jsonObject(with: data!)) as? [String: Any]
            print(responseObject)

            let indexFirstName = responseObject?.index(forKey: "first_name")
            let indexId = responseObject?.index(forKey: "id")
            let indexPictureURL = responseObject?.index(forKey: "picture_url")
            let indexPoints = responseObject?.index(forKey: "points")
            let indexSchool = responseObject?.index(forKey: "school")
            let indexGrade = responseObject?.index(forKey: "grade")
            let indexLastName = responseObject?.index(forKey: "last_name")

            self.users[index].last_name = responseObject![indexLastName!].value as! String
            self.users[index].first_name = responseObject![indexFirstName!].value as! String
            self.users[index].id = responseObject![indexId!].value as! Int
            self.users[index].picture_url = responseObject![indexPictureURL!].value as! String
            self.users[index].points = responseObject![indexPoints!].value as! Int
            self.users[index].school = responseObject![indexSchool!].value as! String
            self.users[index].grade = responseObject![indexGrade!].value as! Int


            DispatchQueue.main.async (
                execute: self.loadRandom8
            )

        } catch {
            print("error in getting data")
        }
    })

    task.resume()

}

最佳答案

没有看到您在 random/one 请求中获得的 JSON 格式,这有点难说,但您应该能够解析单个 User 实例使用

let user = try JSONDecoder().decode(User.self, from: data!)

而不是求助于 JSONSerialization

并将数据放入 users 数组,执行 users[index] = user

关于arrays - 使 JSON 响应符合结构和数组 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51224671/

相关文章:

c - 我的程序有几个错误,我不知道如何修复它们

javascript - 将数组转换为包含对象

arrays - 在foreach循环中使用Parallel::ForkManager

json - 在scala中格式化JSON字符串

swift - Swiftui 中 init() 中的变量前的下划线是什么意思?

java - 返回类似数组的所有子序列,在 Java 中只有连续的值

javascript - 无法使用 res.send() 使用 express with node 发送数字

javascript - 读取已解析的 JSON 响应

ios - 根据 TableViews 自定义单元格中点击的图像执行 segue

ios - UI 更新在不同情况下表现不同