Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
如何使用NSURLSession在Swift中解析JSON_Json_Swift - Fatal编程技术网

如何使用NSURLSession在Swift中解析JSON

如何使用NSURLSession在Swift中解析JSON,json,swift,Json,Swift,我正在尝试解析JSON,但出现以下错误: 表达式类型不明确,没有更多上下文 我的代码是: func jsonParser() { let urlPath = "http://headers.jsontest.com/" let endpoint = NSURL(string: urlPath) let request = NSMutableURLRequest(URL:endpoint!) let session = NSURLSession.sharedSe

我正在尝试解析JSON,但出现以下错误:

表达式类型不明确,没有更多上下文

我的代码是:

func jsonParser() {

    let urlPath = "http://headers.jsontest.com/"
    let endpoint = NSURL(string: urlPath)
    let request = NSMutableURLRequest(URL:endpoint!)

    let session = NSURLSession.sharedSession()
    NSURLSession.sharedSession().dataTaskWithRequest(request){ (data, response, error) throws -> Void in

        if error != nil {
            print("Get Error")
        }else{
            //var error:NSError?
            do {
                let json:AnyObject =  try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(rawValue: 0)) as? NSDictionary

            print(json)

        } catch let error as NSError {
            // error handling
            print(error?.localizedDescription)
        }
        }
    }
    //task.resume()
}
这在Xcode 6.4中没有使用try-catch可以正常工作,但在Xcode 7中不起作用。

苹果在这里声明

func dataTaskWithRequest(request: NSURLRequest, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) -> NSURLSessionDataTask
修复它:

NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
       // Your handle response here!
}
更新:

func jsonParser() {
    let urlPath = "http://headers.jsontest.com/"
    let endpoint = NSURL(string: urlPath)
    let request = NSMutableURLRequest(URL:endpoint!)

    NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
        print(error)
    }.resume()
}
结果:

可选(Error Domain=nsurerrordomain Code=-1022)“由于应用程序传输安全策略要求使用安全连接,因此无法加载资源。”UserInfo={NSUnderlyingError=0x7f8873f148d0{Error Domain=kCFErrorDomainCFNetwork Code=-1022”(null)},NSErrorFailingURLStringKey=,NSErrorFailingURLKey=,NSLocalizedDescription=无法加载资源,因为应用>传输安全策略要求使用安全连接。})


希望这有帮助

不要为解码对象声明
AnyObject
类型,因为您希望它是
NSDictionary
,并且您正在执行转换以执行此操作

对于NSJSONSerialization,最好使用零选项,而不是随机选项

在我的示例中,我还使用了一个自定义错误类型,仅用于演示

请注意,如果您使用的是自定义错误类型,则还必须包含一个泛型的
catch
,以使其详尽无遗(在本例中,使用一个简单的NSError向下转换)

与Swift 3.0.2相同:

enum JSONError: String, Error {
    case NoData = "ERROR: no data"
    case ConversionFailed = "ERROR: conversion from JSON failed"
}

func jsonParser() {
    let urlPath = "http://headers.jsontest.com/"
    guard let endpoint = URL(string: urlPath) else {
        print("Error creating endpoint")
        return
    }
    URLSession.shared.dataTask(with: endpoint) { (data, response, error) in
        do {
            guard let data = data else {
                throw JSONError.NoData
            }
            guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary else {
                throw JSONError.ConversionFailed
            }
            print(json)
        } catch let error as JSONError {
            print(error.rawValue)
        } catch let error as NSError {
            print(error.debugDescription)
        }
    }.resume()
}
1) 将ApiConnection类放入到项目中。。 进口基金会 类ApiConnection:NSObject{

class func postDataWithRequest(_ dicData:NSDictionary, completionHandler:@escaping (_ response:NSDictionary?,_ status:Bool)->Void)
{
    let URL=Foundation.URL(string: Constant.API_URL)
    let request=NSMutableURLRequest(url: URL!)
    request.httpMethod="POST"
    request.addValue(Constant.kApplicationJSON, forHTTPHeaderField:Constant.kContentType)
    let data=try? JSONSerialization .data(withJSONObject: dicData, options: JSONSerialization.WritingOptions.prettyPrinted)
    request.httpBody=data

    //let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC)*5))
    //dispatch_after(dispatchTime, dispatch_get_main_queue()) {
    let session = URLSession.shared.dataTask(with: request as URLRequest,completionHandler: { (data, response, error) in
        if error==nil
        {
            DispatchQueue.main.async(execute: {
                let dicResponse = try? JSONSerialization .jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! NSDictionary
                completionHandler(dicResponse, error==nil)
            })
        }
        else
        { 
            completionHandler(nil, error==nil)
        }
    })
    session.resume()
    }
}
**********************************use this in your view controller****************

let dict : NSMutableDictionary = [:];

    dict["Your key"] = "your value"
    dict["Your key"] = "your value"
    dict["Your key"] = "your value"

    ApiConnection.postDataWithRequest(dict) { (response, status) in 
        if(status){
            print(response);
        else{
            print("failed webservice call");
        }
    }
*************************************迅捷3.0*************************************

        var objDic = [String: Any]()
        let dic = NSMutableDictionary()
        print(dic)
        objDic["action"] = ""
        objDic["product_id"] = self.peroductid
        //            arrProduct .addObjects(from: objDic) as! Dictionary
        print("\(objDic)")


        Alamofire.request(Constant.Webservice_productinfo,
                          method: HTTPMethod.post,
                          parameters:objDic as? Parameters,
                          encoding: JSONEncoding.default,
                          headers: nil).responseJSON


            {
                (response:DataResponse<Any>) in
                switch(response.result)
                {
                case .success(_):
                    if response.result.value != nil
                    {
                          let status = response2?.object(forKey: "status") as! String?

                        if status == "error"{}

                        //finding the status from response
                        var response2 = response.result.value as AnyObject?
                            self.response1 = response.result.value as! NSDictionary
                                                let type = 
                      (self.cartlistarray[0] as!NSDictionary)["base_image"]
                                      cell.productname.text = (self.cartlistarray[0] as!NSDictionary)["name"] as? String

    //Store the result value in swift 3.0

    UserDefaults.standard.set(userDetail.value(forKey: "email") as? NSString, forKey: "email")
        if(UserDefaults.standard.object(forKey:"email") == nil){}
//did select row click the data pass into  another view  
  let ProductListViewController = self.storyboard?.instantiateViewController(withIdentifier: "ProductListViewController") as! ProductListViewController         
 ProductListViewController.category_id = ((self.bannerarry[0] as? [String : String])?["cat_id"])!

//or else callin from indexpath.row

            item  = ((cartlistarray[indexpath.row] as? NSDictionary)?.value(forKey:"product_id") as! String?)!
 NSDictionary *objDic1 = @{@"mode":@"loginUser",
                                       @"email":[result 
 objectForKey:@"email"],
                                       @"password":@"",
                                       };
             // With AFNetworking
             AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
             manager.requestSerializer = [AFJSONRequestSerializer serializer];
             [manager.requestSerializer setTimeoutInterval:100];

             //    manager set
             [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

             [manager POST:WEBSERVICE_CALL_URL parameters:objDic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable result) {

                 [SVProgressHUD dismiss];

                 NSLog(@"This s my response %@",result);
                 NSLog(@"success!");

                 if ([[result valueForKey:kStatus] isEqualToString:kOK])
                 {
                 }
                   }
                   failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
              {
}];
****************SDK LINK*******************************************
https://github.com/AFNetworking/AFNetworking

var userDetail = NSArray()
                                userDetail = self.response1.value(forKey: "userData") as! NSArray
                                print(userDetail)

 self.tmpDic = userDetail[0] as! NSDictionary
                                        print(self.tmpDic)

                                        var optionsdic = NSDictionary()
                                        optionsdic = self.tmpDic.value(forKey:"options") as! NSDictionary
                                        print(optionsdic)

                                        self.arrayOfKeys = optionsdic.allKeys as NSArray
                                        print(self.arrayOfKeys)
                                        if (self.arrayOfKeys.contains("color"))
                                        {
                                            print("color")

                                            self.colorarray = optionsdic.value(forKey:"color") as! NSArray
                                            print(self.colorarray.count)

                                            for index in 0..<self.colorarray.count
                                            {
                                                var dic = NSDictionary ()
                                                dic = self.colorarray .object(at: index) as! NSDictionary
                                                self.colorarrayobject .add(dic)
                                                print(dic)
                                            }
                                            print(self.colorarrayobject)

                                        }
                                        else {

                                            var defaultarray = NSArray()
                                            defaultarray = optionsdic.value(forKey:"default") as! NSArray
                                            print(defaultarray)

                                            self.element0array = defaultarray[0] as! NSArray
                                            print(self.element0array)


                                            self.dic = self.element0array[0] as! NSDictionary
                                            print(dic)

                                            self.arr5 = self.dic .value(forKey: "values") as! NSArray
                                            print(self.arr5)

                                            for iteams in 0..<self.arr5.count
                                            {

                                                var type = String()
                                                type = ((self.arr5[iteams]as! NSDictionary)["label"]! as? String)!
                                                self.configeresizeaarray.append(type)
                                            }

                                            print("default")

                                        }

                                    }
                                    self.imagearray   = self.array[0] as! NSArray

                                    for items in 0..<self.imagearray.count
                                    {
                                        var type = String()
                                        type = ((self.imagearray [items]as! NSDictionary)["image"]! as? String)!
                                        self.cell0imagearray.append(type)
                                    }
                                    self.count = self.imagearray.count as Int
                                    self.configurePageControl()
                                    self.tableView.reloadData()
                                }
                                else
                                {

                                }

                            }
                            else
                            {

                            }
} 扩展UILabel{

func setLabel(strTitle:String)
{
    self.backgroundColor = UIColor.clear
    self.textColor = UIColor.white
    self.textAlignment = NSTextAlignment.left
    self.font = UIFont(name: "Avenir-Light", size: 15.0)
    self.font = UIFont.italicSystemFont(ofSize: 15)
    self.text=strTitle
}
}

**************************objc**************************************************

        var objDic = [String: Any]()
        let dic = NSMutableDictionary()
        print(dic)
        objDic["action"] = ""
        objDic["product_id"] = self.peroductid
        //            arrProduct .addObjects(from: objDic) as! Dictionary
        print("\(objDic)")


        Alamofire.request(Constant.Webservice_productinfo,
                          method: HTTPMethod.post,
                          parameters:objDic as? Parameters,
                          encoding: JSONEncoding.default,
                          headers: nil).responseJSON


            {
                (response:DataResponse<Any>) in
                switch(response.result)
                {
                case .success(_):
                    if response.result.value != nil
                    {
                          let status = response2?.object(forKey: "status") as! String?

                        if status == "error"{}

                        //finding the status from response
                        var response2 = response.result.value as AnyObject?
                            self.response1 = response.result.value as! NSDictionary
                                                let type = 
                      (self.cartlistarray[0] as!NSDictionary)["base_image"]
                                      cell.productname.text = (self.cartlistarray[0] as!NSDictionary)["name"] as? String

    //Store the result value in swift 3.0

    UserDefaults.standard.set(userDetail.value(forKey: "email") as? NSString, forKey: "email")
        if(UserDefaults.standard.object(forKey:"email") == nil){}
//did select row click the data pass into  another view  
  let ProductListViewController = self.storyboard?.instantiateViewController(withIdentifier: "ProductListViewController") as! ProductListViewController         
 ProductListViewController.category_id = ((self.bannerarry[0] as? [String : String])?["cat_id"])!

//or else callin from indexpath.row

            item  = ((cartlistarray[indexpath.row] as? NSDictionary)?.value(forKey:"product_id") as! String?)!
 NSDictionary *objDic1 = @{@"mode":@"loginUser",
                                       @"email":[result 
 objectForKey:@"email"],
                                       @"password":@"",
                                       };
             // With AFNetworking
             AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
             manager.requestSerializer = [AFJSONRequestSerializer serializer];
             [manager.requestSerializer setTimeoutInterval:100];

             //    manager set
             [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

             [manager POST:WEBSERVICE_CALL_URL parameters:objDic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable result) {

                 [SVProgressHUD dismiss];

                 NSLog(@"This s my response %@",result);
                 NSLog(@"success!");

                 if ([[result valueForKey:kStatus] isEqualToString:kOK])
                 {
                 }
                   }
                   failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
              {
}];
****************SDK LINK*******************************************
https://github.com/AFNetworking/AFNetworking

var userDetail = NSArray()
                                userDetail = self.response1.value(forKey: "userData") as! NSArray
                                print(userDetail)

 self.tmpDic = userDetail[0] as! NSDictionary
                                        print(self.tmpDic)

                                        var optionsdic = NSDictionary()
                                        optionsdic = self.tmpDic.value(forKey:"options") as! NSDictionary
                                        print(optionsdic)

                                        self.arrayOfKeys = optionsdic.allKeys as NSArray
                                        print(self.arrayOfKeys)
                                        if (self.arrayOfKeys.contains("color"))
                                        {
                                            print("color")

                                            self.colorarray = optionsdic.value(forKey:"color") as! NSArray
                                            print(self.colorarray.count)

                                            for index in 0..<self.colorarray.count
                                            {
                                                var dic = NSDictionary ()
                                                dic = self.colorarray .object(at: index) as! NSDictionary
                                                self.colorarrayobject .add(dic)
                                                print(dic)
                                            }
                                            print(self.colorarrayobject)

                                        }
                                        else {

                                            var defaultarray = NSArray()
                                            defaultarray = optionsdic.value(forKey:"default") as! NSArray
                                            print(defaultarray)

                                            self.element0array = defaultarray[0] as! NSArray
                                            print(self.element0array)


                                            self.dic = self.element0array[0] as! NSDictionary
                                            print(dic)

                                            self.arr5 = self.dic .value(forKey: "values") as! NSArray
                                            print(self.arr5)

                                            for iteams in 0..<self.arr5.count
                                            {

                                                var type = String()
                                                type = ((self.arr5[iteams]as! NSDictionary)["label"]! as? String)!
                                                self.configeresizeaarray.append(type)
                                            }

                                            print("default")

                                        }

                                    }
                                    self.imagearray   = self.array[0] as! NSArray

                                    for items in 0..<self.imagearray.count
                                    {
                                        var type = String()
                                        type = ((self.imagearray [items]as! NSDictionary)["image"]! as? String)!
                                        self.cell0imagearray.append(type)
                                    }
                                    self.count = self.imagearray.count as Int
                                    self.configurePageControl()
                                    self.tableView.reloadData()
                                }
                                else
                                {

                                }

                            }
                            else
                            {

                            }
NSDictionary*objDic1=@{@“模式”:@“登录用户”,
@“电子邮件”:[结果]
objectForKey:@“电子邮件”],
@“密码”:@“,
};
//使用AFN网络
AFHTTPSessionManager*manager=[[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
manager.requestSerializer=[AFJSONRequestSerializer序列化程序];
[manager.requestSerializer setTimeoutInterval:100];
//管理器集
[manager.requestSerializer设置值:@“应用程序/json”用于HttpHeaderField:@“内容类型”];
[manager POST:WEBSERVICE\u CALL\u URL参数:objDic1进度:无成功:^(NSURLSessionDataTask*\u非空任务,id为空结果){
[SVD解散];
NSLog(@“这是我的回答%@”,结果);
NSLog(@“成功!”);
如果([[result valueForKey:kStatus]IseQualtString:kOK])
{
}
}
失败:^(NSURLSessionDataTask*_可空任务,NSError*_非空错误)
{
}];
****************SDK链接*******************************************
https://github.com/AFNetworking/AFNetworking
var userDetail=NSArray()
userDetail=self.response1.value(forKey:“userData”)为!不可变数组
打印(用户详细信息)
self.tmpDic=userDetail[0]as!字典
打印(self.tmpDic)
var optionsdic=NSDictionary()
optionsdic=self.tmpDic.value(forKey:“options”)as!字典
打印(可选DIC)
self.arrayOfKeys=选项DIC.allKeys作为NSArray
打印(self.arrayOfKeys)
if(self.arrayOfKeys.contains(“颜色”))
{
打印(“颜色”)
self.colorarray=optionsdic.value(forKey:“color”)作为!NSArray
打印(self.colorarray.count)

对于0..中的索引,这里是使用NSUrlSession解析JSON的最简单方法

 let PARAMS = "{\"params1\":\"%@\",\"Params2\":\"%@\",\"params3\":\"%@\"}"
 let URL = "your url here"
在“提交”按钮上写下此代码

let urlStr = String(format: "%@",URL)
let jsonString = String(format:PARAMS, params1value,params2value,params3value )
// Encode your data here
let jsonData = jsonString.data(using:.utf8)
var request = URLRequest(url: URL(string: urlStr)!)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
//set your method type here 
request.httpMethod = "POST"
request.httpBody = jsonData
let configuration = URLSessionConfiguration.default
// create a session here
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
    let task = session.dataTask(with: request) {(data , response, error) in
        if(error != nil){
            print("Error \(String(describing: error))")
        }
 else {
            do {
                let fetchedDataDictionary = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary
                print(fetchedDataDictionary!)
                let message = fetchedDataDictionary?["response key here"] as! String
                if message == "your response string" {
                    print(message)

                }
                else {
                     self.dataArray = (fetchedDataDictionary?["data"] as! NSArray)
                }
            }
            catch let error as NSError {
                print(error.debugDescription)
            }
        }
    }
    task.resume()

对于Swift 4 Web服务调用,使用URLSession发布方法

 func WebseviceCall(){
        var request = URLRequest(url: URL(string: "YOUR_URL")!)
        request.httpMethod = "POST"
        let postString = "PARAMETERS"
        request.httpBody = postString.data(using: .utf8)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("application/json", forHTTPHeaderField: "Accept")

        let task = URLSession.shared.dataTask(with: request) { data, response, error in

            guard let data = data, error == nil else {
                print("error=\(error)")
                return
            }

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")
            }

            do {
                if let convertedJsonIntoDict = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
                    // Print out dictionary
                    print(convertedJsonIntoDict)
               }
            } catch let error as NSError {
                print(error.localizedDescription)
            }
        }
        task.resume()
    }

我也使用过此代码,但出现错误“表达式类型不明确,没有更多上下文”。请查看我的代码。删除
会在代码中抛出
。请!我将在操场上测试它。请稍等。更新代码不会出现编译器错误,但当我们在此块中编写代码时{let json:AnyObject=try NSJSONSerialization.JSONObjectWithData(数据,选项:NSJSONReadingOptions(rawValue:0))as?NSDictionary print(json)}捕获let error as NSError{//错误处理打印(错误?.localizedDescription)}。这是一个错误。我稍后会查看您的问题。现在,我很忙:pAnswer与问题无关。
 func WebseviceCall(){
        var request = URLRequest(url: URL(string: "YOUR_URL")!)
        request.httpMethod = "POST"
        let postString = "PARAMETERS"
        request.httpBody = postString.data(using: .utf8)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("application/json", forHTTPHeaderField: "Accept")

        let task = URLSession.shared.dataTask(with: request) { data, response, error in

            guard let data = data, error == nil else {
                print("error=\(error)")
                return
            }

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")
            }

            do {
                if let convertedJsonIntoDict = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
                    // Print out dictionary
                    print(convertedJsonIntoDict)
               }
            } catch let error as NSError {
                print(error.localizedDescription)
            }
        }
        task.resume()
    }