这是来自服务器的我的php文件:
<?php
$results = Array(
Array(
"name" => "William",
"location" => "UK",
"action" => "Post Update"
),
Array(
"name" => "Sammy",
"location" => "US",
"action" => "posted news"
)
);
header("Content-Type: application/json");
echo json_encode($results);
?>
这就是我尝试从swift
中获取json数组的方法let urlPath = "http://someurltophpserver"
let url = NSURL(string: urlPath)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
if ((error) != nil) {
println("Error")
} else {
let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
// do something with the data
}
})
task.resume()
应用程序在此行let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
崩溃且出错:
Could not cast value of type '__NSArrayM' (0x8c9b58) to 'NSDictionary' (0x8c9d74).
swift和http请求新手,所以不完全确定这意味着什么。
答案 0 :(得分:1)
您的应用崩溃的原因是as!
。您正试图强制打开可选项,因此如果在运行时失败,应用程序将崩溃。
将行更改为:
if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary
{
// Do stuff if jsonResult set with a value of type NSDictionary
}
这会阻止应用程序崩溃,但从它的外观来看,JSON序列化程序返回的顶级对象将是NSArray
而不是您期望的NSDictionary
,这可能就是为什么该应用实际崩溃。
你的代码告诉编译器“让jsonResult等于一个肯定会成为NSDictionary的值”。
另外,作为一方,我建议使用NSData(contentsOfURL:url)
下载某些数据的最简单方法。使用Grand Central Dispatch在后台队列中运行此命令以避免阻塞主线程(UI)。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let data = NSData(contentsOfURL: url)
// Run any other code on the main queue. Especially any UIKit method.
NSOperationQueue.mainQueue().addOperationWithBlock({
// Do stuff with data
})
}