我正在使用iOS app
构建Swift3
,并且对于应用程序的一部分,我向网页发送HTTP POST
请求,该网页返回包含5个不同数组的JSON
对象。我希望收到这个JSON object in Swift
,并以可读格式(NSArray)使这些数组。以下是我的网页返回的内容。
{"className":["U.S. History 2 (AP)","Chemistry (HN)","Algebra 2 (HN)","Spanish 3 (HN)"],"teacherLastName":["Schartner","Racz","Johnson","Burdette"],"teacherFirstName":["Lindsey","Gregory","Shane","Joy"],"teacherTitle":["Mrs.","Mr.","Mr.","Sra."],"classID":["0001","0002","0003","0004"]}
我试图在我的Swift代码中执行以下操作。我不完全确定从哪里开始,但这是我到目前为止所做的。
func getClassList() -> NSArray{
let myUrl = URL(string: "http://papili.us/studycentral/api/getClassList.php");
var request = URLRequest(url:myUrl!)
request.httpMethod = "POST"// Compose a query string
let postString = "";
request.httpBody = postString.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
if error != nil {
print("error=\(error)")
return
}
// Print out response object
print("response = \(response)")
//Convert response sent from a server side script to a NSDictionary object:
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
// Access value of username, name, and email by its key
let newdata : NSDictionary = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
let info : NSArray = newdata.value(forKey: "className") as! NSArray
self.classList = info
}
} catch {
print(error)
}
}
task.resume()
return self.classList
}
有人可以解释我需要做什么才能正确读取JSON对象中的数组吗?非常感谢你
凯尔,
这里有很多事情要做。您所犯的最大错误是将异步函数视为同步函数。传递给dataTask
的闭包是异步执行的,这意味着在你return self.classList
时它不会完成(最有可能)。为了解决这个问题,你的getClassList
方法本身应该采用一个闭包,它将在数据任务完成时调用。
它看起来像这样:
func getClassList(completion: ((NSArray?, NSError?) -> Void)?) {
let myUrl = URL(string: "http://papili.us/studycentral/api/getClassList.php");
var request = URLRequest(url:myUrl!)
request.httpMethod = "POST"// Compose a query string
let postString = "";
request.httpBody = postString.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
if error != nil {
print("error=\(error)")
completion?(nil, error)
return
}
// Print out response object
print("response = \(response)")
//Convert response sent from a server side script to a NSDictionary object:
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
// Access value of username, name, and email by its key
let newdata : NSDictionary = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
let info : NSArray = newdata.value(forKey: "className") as! NSArray
completion?(info, nil)
}
} catch {
print(error)
completion?(nil, error)
}
}
task.resume()
}
你访问这些数据的方法是调用带有getClassList
和NSArray?
的闭包的NSError?
并用它们做你想要的。这类似于你所谓的dataTask
。
此外,这个请求看起来更像是GET
而不是POST
给我。根据您使用的API仔细检查您是否正在构建请求。
还有其他一些方法我建议清理这些代码,但我认为这些是推动你前进的要点。
查看此库:JSONParserSwift
您可以轻松解析JSON。
只需创建以下模型:
class BaseModel: ParsableModel {
var className: [String]?
var teacherLastName: [String]?
var teacherFirstName: [String]?
var teacherTitle: [String]?
var classID: [String]?
}
现在调用以下方法:
do {
let parsedModel: BaseModel = try JSONParserSwift.parse(string: jsonString)
} catch {
print(error)
}