2017-05-05 1 views
1

Das Problem, mit dem ich konfrontiert bin, ist, dass ich zwei Arrays in einer iOS-Anwendung habe, die ich in einer Remote-MySQL-Datenbank speichern muss, die ich mit PHP und JSON erreichen möchte. Ich habe es jedoch trotz mehrerer Arbeitstage nicht geschafft, die Arrays in der iOS-App in JSON-Code umzuwandeln, der die App nicht zum Absturz bringt. Die Arrays werden von einem QR-Code-Leser und einem Eingabefeld ausgefüllt, und in jedem Array ist immer die gleiche Anzahl von Elementen vorhanden. Zur Zeit unterhalb der Code generiert die folgende json:Parsen von Swift-Arrays in gültige JSON

json string = {"b":"[\n\n]","p":"[\n\n]"}

Egal, welche Änderungen ich tue, die App mit dem folgenden Fehler zum Absturz zu bringen scheint: App beenden aufgrund nicht abgefangene Ausnahme ‚NSInvalidArgumentException‘, Grund: ‚* ** + [NSJSONSerialization dataWithJSONObject: options: error:]: Ungültiger Typ der obersten Ebene in JSON write 'oder alternativ Error Domain = NSCOAErrorDomain Code = 3840 "JSON-Text hat nicht mit Array oder Objekt und Option begonnen, um Fragmente nicht zuzulassen einstellen." Userinfo = {NSDebugDescription = JSON Text nicht mit Array oder Objekt und Option starten Fragmente gesetzt, damit es nicht.} Mit einigen meiner anderen Experimenten (wie die Version, die derzeit unter)

var productArray = [String]() 
var amountArray = [String]() 



func addTapped(sender: UIBarButtonItem) { 
    print("Running add func") 
    do { 
     var test1 = "" 
     var test2 = "" 
     //Convert to Data 
     let jsonData1 = try! JSONSerialization.data(withJSONObject: amountArray, options: JSONSerialization.WritingOptions.prettyPrinted) 
     let jsonData2 = try! JSONSerialization.data(withJSONObject: productArray, options: JSONSerialization.WritingOptions.prettyPrinted) 

     //Convert back to string. Usually only do this for debugging 
     if let JSONString1 = String(data: jsonData1, encoding: String.Encoding.utf8) { 
      print(JSONString1) 
      test1 = JSONString1 
     } 
     if let JSONString2 = String(data: jsonData2, encoding: String.Encoding.utf8) { 
      print(JSONString2) 
      test2 = JSONString2 
     } 
     //In production, you usually want to try and cast as the root data structure. Here we are casting as a dictionary. If the root object is an array cast as [AnyObject]. 
     var json1 = try JSONSerialization.jsonObject(with: jsonData1, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: AnyObject] 
     var json2 = try JSONSerialization.jsonObject(with: jsonData2, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: AnyObject] 






     let dict = ["json1": test1, "json2": test2] as [String: Any] 


     print("All JSON should print below") 
     print(dict) 
     if let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) { 
      let url = NSURL(string: "http://www.server.com/receiver")! 
      let request = NSMutableURLRequest(url: url as URL) 
      request.httpMethod = "POST" 
      request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
      request.httpBody = jsonData 

      let task = URLSession.shared.dataTask(with: request as URLRequest){ data,response,error in 
       if error != nil{ 
        print(error?.localizedDescription) 
        return 
       } 

       do { 
        let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 

        if let parseJSON = json { 
         let resultValue:String = parseJSON["success"] as! String; 
         print("result: \(resultValue)") 
         print(parseJSON) 
        } 
       } catch let error as NSError { 
        print(error) 
       }   
      }   
      task.resume() 
     } 


    } catch { 
     print("Oops") 
    } 

} 
+0

in welcher Zeile gestoppt Ihrem Code verwenden können? – KKRocks

+0

@KKRocks Das ist ein Teil meines Problems - XCode denkt, dass Informationen unnötig sind, obwohl Zombie-Objekte aktiviert sind, also sagt es mir das nicht. –

+0

Ausnahmebreakpoint setzen und Code erneut ausführen: http://Stackoverflow.com/a/17802868/3901620 – KKRocks

Antwort

1

Ich denke, die beste Lösung verwendet SwiftyJSON

Whit, die, wenn Sie einen String haben Sie var json = JSON.parse(yourString)