web-dev-qa-db-fra.com

Comment analyser JSON dans Swift avec NSURLSession

J'essaie d'analyser JSON mais j'obtiens l'erreur suivante:

type d'expression est ambigu sans plus de contexte

Mon code est:

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()
}

Cela fonctionne très bien sans try catch dans Xcode 6.4, mais cela ne fonctionne pas dans Xcode 7.

12
vipulk617

Ne déclarez pas un type AnyObject pour votre objet décodé, car vous voulez que ce soit un NSDictionary et que vous effectuez une conversion pour le faire.

De plus, il vaut mieux utiliser zéro option pour NSJSONSerialization plutôt que aléatoire.

Dans mon exemple, j'ai également utilisé un type d'erreur personnalisé uniquement à des fins de démonstration.

Notez que si vous utilisez un type d'erreur personnalisé, vous devez également inclure une variable générique catch pour qu'elle soit exhaustive (dans cet exemple, avec une simple conversion en fond clair vers NSError).

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

func jsonParser() {
    let urlPath = "http://headers.jsontest.com/"
    guard let endpoint = NSURL(string: urlPath) else {
        print("Error creating endpoint")
        return
    }
    let request = NSMutableURLRequest(URL:endpoint)
    NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) in
        do {
            guard let data = data else {
                throw JSONError.NoData
            }
            guard let json = try NSJSONSerialization.JSONObjectWithData(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()
}

Idem avec 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()
}
32
ayaio

Apple déclare ici.

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

Répare le:

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

METTRE À JOUR:

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()
}

RÉSULTAT:

Facultatif (Domaine d'erreur = Code NSURLErrorDomain = -1022 "La ressource n'a pas pu être chargée car la stratégie de sécurité du transport d'applications nécessite l'utilisation d'une connexion sécurisée." UserInfo = {NSUnderlyingError = 0x7f8873f148d0 {Domaine d'erreur = Code kCFErrorDomainCFNetwork = -1022 "(null ) "}, NSErrorFailingURLStringKey = http://headers.jsontest.com/ , NSErrorFailingURLKey = http://headers.jsontest.com/ , NSLocalizedDescription = La ressource n'a pas pu être chargée car l'application est> La stratégie de sécurité du transport nécessite l'utilisation d'une connexion sécurisée.})

J'espère que cela t'aides!

4
Long Pham

Voici le moyen le plus simple d’analyser JSON à l’aide de NSUrlSession.,

 let PARAMS = "{\"params1\":\"%@\",\"Params2\":\"%@\",\"params3\":\"%@\"}"
 let URL = "your url here"

sur le bouton d'envoi, écrivez ce code.,

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()
0
User558

Pour l'appel de service Web Swift 4, la méthode d'envoi avec 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()
    }
0
Akshay Mirgal