解析在swift中循环遍历json数组

时间:2015-09-26 23:15:02

标签: json swift parsing

这是来自服务器的我的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请求新手,所以不完全确定这意味着什么。

1 个答案:

答案 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
    })
}