符合 JSON 对结构和数组 Swift 的响应
Conforming JSON response to struct and array Swift
目前,我有一个名为 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()
}
在没有看到 JSON 格式的情况下,您收到的 random/one
请求有点难说,但您应该能够使用 User
解析单个 User
实例=16=]
let user = try JSONDecoder().decode(User.self, from: data!)
而不是诉诸 JSONSerialization
并将数据放入 users
数组,执行 users[index] = user
目前,我有一个名为 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()
}
在没有看到 JSON 格式的情况下,您收到的 random/one
请求有点难说,但您应该能够使用 User
解析单个 User
实例=16=]
let user = try JSONDecoder().decode(User.self, from: data!)
而不是诉诸 JSONSerialization
并将数据放入 users
数组,执行 users[index] = user