Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift 3中读取JSON文件时出错_Ios_Swift_Swift3_Xcode8 - Fatal编程技术网

Ios 在Swift 3中读取JSON文件时出错

Ios 在Swift 3中读取JSON文件时出错,ios,swift,swift3,xcode8,Ios,Swift,Swift3,Xcode8,我在swift 2.2中的所有项目中都使用了这段代码,但当我在将xcode更新为xcode 8后创建新项目时,我在用这段代码读取JSON文件时遇到了这个问题 do { let comURL = "mylinkhere"+"customer_key=\(self.customer_key)" // NSLog("PostData: %@",post) let regURL:NSURL = NSURL(string: comURL)!

我在swift 2.2中的所有项目中都使用了这段代码,但当我在将xcode更新为xcode 8后创建新项目时,我在用这段代码读取JSON文件时遇到了这个问题

 do {


        let comURL = "mylinkhere"+"customer_key=\(self.customer_key)"


        // NSLog("PostData: %@",post)

        let regURL:NSURL = NSURL(string: comURL)!


        //let postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)!

        //let postLength:NSString = String( postData.length )

        let request:NSMutableURLRequest = NSMutableURLRequest(url: regURL as URL)
        request.httpMethod = "POST"
        //request.HTTPBody = postData
        //request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.setValue("application/json", forHTTPHeaderField: "Accept")

        var reponseError: NSError?
        var response: URLResponse?

        var urlData: NSData?

        do {
            urlData = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning:&response) as NSData?
            // print(urlData)
        } catch let error as NSError {
            reponseError = error
            urlData = nil
        }

        if ( urlData != nil ) {

            let res = response as! HTTPURLResponse!;

            //NSLog("Response code: %ld", res?.statusCode);

            if ((res?.statusCode)! >= 200 && (res?.statusCode)! < 300)
            {
                let responseData:NSString  = NSString(data:urlData! as Data, encoding:String.Encoding.utf8.rawValue)!

                NSLog("Response Data ==> %@", responseData );

                //var error: NSError?

                let jsonData = try JSONSerialization.jsonObject(with: urlData! as Data,  options: .allowFragments) as! [String:AnyObject]




                self.Appstatus = (jsonData as AnyObject).value("android_app_status") as! NSString



               self.StreamURL = (jsonData as AnyObject).value("android_streaming_url") as! NSString

                //[jsonData[@"success"] integerValue];

               // NSLog("App Status2: %@", self.Appstatus);
               // NSLog("App Stream URL2: %@", self.StreamURL);

                if(self.Appstatus == "true")

                {


                }

                else{

                }


            }

        } else {
            let alertView:UIAlertView = UIAlertView()
            alertView.title = "Sign in Failed!"
            alertView.message = "Connection Failure"
            if let error = reponseError {
                alertView.message = (error.localizedDescription)
            }
            alertView.delegate = self
            alertView.addButton(withTitle: "OK")
            alertView.show()
        }

    } catch {
        let alertView:UIAlertView = UIAlertView()
        alertView.title = "Sign Up Failed!"
        alertView.message = "Server Error!"
        alertView.delegate = self
        alertView.addButton(withTitle: "OK")
        alertView.show()
    }
错误是:
您不必将jsonData类型转换为任何对象,正如我从代码中看到的,这是一个类型为[String:AnyObject]的字典。如果你想从JSONDATA打开一个字符串,我建议你考虑下面的代码。
if let appStatus = jsonData["android_app_status"] as? NSString{
   self.AppStatus = appStatus
}
通过这种安全的解包,你可以确保你的程序不会崩溃,即使字典没有“android应用程序状态”键


希望这有帮助。

在Swift 3中,大多数
AnyObject
类型已更改为
Any

基本上是用Swift

  • 不要使用
    valueForKey
    获取字典键的值,请使用键订阅
  • 在将类型向下转换后,不要将其向上转换(
    作为AnyObject
    ),这样会产生相反的效果
  • < P>不要使用基金会<代码> NScord。使用Swift
    字符串

    let jsonData = try JSONSerialization.jsonObject(with: urlData! as Data,  options: .allowFragments) as! [String:Any]
    self.Appstatus = jsonData["android_app_status"] as! String
    self.StreamURL = jsonData["android_streaming_url"] as! String
    
如果不保证密钥存在,请使用可选绑定以避免运行时错误


最后,不要使用不推荐的同步URL加载API。

显示您的json响应。如下:响应数据==>{“android\u streaming\u URL”:“link”,“ios\u streaming\u URL”:“link”,“android\u app\u status”:“true”,“ios\u app\u status”:“true”}如果您将
[String:AnyObject]
,那么之后为什么要将
jsonData作为AnyObject
?所以试试self.Appstatus=(jsondataas[String:AnyObject])。value(“android\u app\u status”)as!NSString它不起作用,但我试过这样做,现在它可以自己工作了。Appstatus=jsonData[“ios\u app\u status”]as!字符串作为NSStringI尝试了这一点,现在它工作了,谢谢你self.Appstatus=jsonData[“ios\u app\u status”]as!NSStringI写的字符串:不要使用基金会<代码> NString < /C>。拆下第二个铸件
let jsonData = try JSONSerialization.jsonObject(with: urlData! as Data,  options: .allowFragments) as! [String:Any]
self.Appstatus = jsonData["android_app_status"] as! String
self.StreamURL = jsonData["android_streaming_url"] as! String