2017-05-16 6 views
1

Ich versuche, Audiodatei an eine API zu posten, aber ich erhalte einen Fehler "*** App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException' beenden, Grund: 'Ungültiger Typ in JSON schreiben (NSURL) ‚“ Hier ist mein Code:JSONSerialization Fehler in swift3

let parameters = [fileUrl] 

    //create the url with NSURL 
    let url = NSURL(string: "httpblahblah") 

    //create the session object 
    let session = URLSession.shared 

    //now create the NSMutableRequest object using the url object 
    let request = NSMutableURLRequest(url: url! as URL) 
    request.httpMethod = "POST" //set http method as POST 

    do { 
     request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body 

    } catch let error { 
     print(error.localizedDescription) 
    } 

    //HTTP Headers 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    //create dataTask using the session object to send data to the server 
    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in 

     guard error == nil else { 
      return 
     } 

     guard let data = data else { 
      return 
     } 

     do { 
      //create json object from data 
      if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: AnyObject] { 
       print(json) 
       // handle json... 
      } 

     } catch let error { 
      print(error.localizedDescription) 
     } 

    }) 

    task.resume() 
+0

i für diese Funktionalität zu Ihnen will damit Sie –

Antwort

0

wenn Sie request.httpBody erstellen, vorbei sind Sie in der parameters Array deklariert Sie oben:

let parameters = [fileUrl] 

Es aus dem Code nicht klar ist, aber wenn fileUrl ist eine NSURL anstelle einer String, die den Fehler verursachen würde, den Sie sehen. Die Dokumentation für JSONSerialization sagt:

Alle Objekte sind Instanzen von NSString, NSNumber, NSArray, NSDictionary oder NSNull.

so versuchen, in einem NSURL schleichen wird definitiv nicht funktionieren.

Unter der Annahme, dass Ihre Absicht fileUrl als String zu serialisiert ist, können Sie tun, indem Sie die Erklärung auf sich ändernde:

let parameters = [fileUrl.absoluteString!] 

Wenn Sie die aktuelle Datei, Daten zu senden, Sie gehen nicht zu sein in der Lage, es in einem JSON-Objekt zu serialisieren. Ein gutes Beispiel für das Senden von Daten von einer Datei an einen Server finden Sie unter this question und ihrer Antwort. Abhängig von der API, mit der Sie arbeiten, benötigen Sie möglicherweise noch das JSON-Objekt für andere Daten, und seine Struktur wird von der API bestimmt.

+0

alamofire Dritte Bibliothek verwenden kann ich Audio-Datei und ich habe den Systempfad zu. Shuld ich konvertiere es zuerst in Daten? – helpmemister

-1

Von dem, was ich verstehe, versuchen Sie, eine Audiodatei mit einer URL Referenz anstelle von Data hochladen. Erhalten Sie korrektes Datenformat von URL mit diesem:

let data = FileManager.default.contents(atPath: fileUrl.path) 
request.httpBody = data 
+0

Was ist falsch an meiner Antwort? Sie haben versucht, einen JSON von einer URL zu serialisieren. Das ist nicht möglich. Wenn Sie eine andere Methode zum Abrufen von Daten von einer lokalen URL benötigen, ist dies nicht korrekt –