解析 json 数组中循环swift

标签: json Swift
发布时间: 2017/3/5 13:24:58
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

这是我从一台服务器的 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);
?>

这是我多么努力地获取 json 数组从内swift

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:

您的应用程序崩溃的原因是因为 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 serialiser 的顶级对象要 NSArrayNSDictionary 你似乎期待,那可能就是为什么该应用程序实际上崩溃。 你代码说到编译器"让 jsonResult 肯定要将 NSDictionary 的值相等"。

同时,作为一支球队,我会推荐下载一些最简单的方法数据是与 NSData(contentsOfURL:url) 。运行此背景队列使用盛大中央调度避免阻塞主线程 (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
    })
}
赞助商