2017-10-17 5 views
0

J'essaie de collecter des données de l'utilisateur et de l'envoyer à un service Web, mais je reçois une erreur "type de haut niveau invalide en écriture JSON" Je recueille les étapes du magasin de santé dans un autre fonction et toutes les données sont transmises correctement dans les variables userhealthprofile au fur et à mesure de leur impression. Mais quelque chose ne va pas avec mon code JSONPublication de l'entrée utilisateur JSON dans Swift

message d'erreur complète est

2017-10-17 09:30:57.170950+0200 IphoneReader[347:40755] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write' 
*** First throw call stack: 
(0x1d0b3b3d 0x1c33b067 0x1d0b3a85 0x1da763c1 0x9aa50 0x9bb60 0x2231a3b5 0x2231a349 0x22304979 0x22321f87 0x2286bf1b 0x22868833 0x22868423 0x22867849 0x223146f5 0x222e62bb 0x22a797f7 0x22a7419b 0x22a7457d 0x1d06ffdd 0x1d06fb05 0x1d06df51 0x1cfc11af 0x1cfc0fd1 0x1e76bb41 0x22349a53 0xa4d18 0x1c7ae4eb) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

code

@IBAction func submitAction(sender: AnyObject) { 

    userHealthProfile.name = nameLabel.text 
    print(userHealthProfile.name) 

    userHealthProfile.age = Int(ageLabel.text!) 
    print(userHealthProfile.age) 

    userHealthProfile.heightInMeters = Int(heightLabel.text!) 
    print(userHealthProfile.heightInMeters) 

    userHealthProfile.weightInKilograms = Int(weightLabel.text!) 
    print(userHealthProfile.weightInKilograms) 

    for element in stepy.step { 
     print(element) 
    } 

    userHealthProfile.totalStepsCount = stepy.step 

    print("pressing button") 

    //create the url with URL 
    let url = URL(string: "www.thisismylink.com/postName.php")! 
    //change the url 

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

    //now create the URLRequest object using the url object 
    var request = URLRequest(url: url) 
    request.httpMethod = "POST" //set http method as POST 

    do { 
     request.httpBody = try JSONSerialization.data(withJSONObject: userHealthProfile, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body 
    } catch let error { 
     print(error.localizedDescription) 
    } 

    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: Any] { 
       print(json) 
       // handle json... 
      } 
     } catch let error { 
      print(error.localizedDescription) 
     } 
    }) 
    task.resume() 
} 

C'est ce que userprofile ressemble, ce que je dois envoyer comme JsonObject pour mon service Web.

class UserHealthProfile { 

    var name: String? 
    var age: Int? 
    var totalStepsCount: Array<Any>! 
    var heightInMeters: Int? 
    var weightInKilograms: Int? 

} 
+0

Ajouter l'erreur que vous obtenez ... – Ladislav

+0

Ajouté l'erreur complète –

+0

On dirait userHealthProfile n'est pas un '[[String: Any]]' ou '[String: Any]' – Marcel

Répondre

0

Je pense que vous devriez utiliser pour appeler Alamofire API web .. Voici l'exemple de code en fonction de vos besoins.

J'espère que cela vous aidera ...

func Submit(parametersToSend:NSDictionary) 
{ 


Alamofire.request(.POST, "http://www.thisismylink.com/postName.php",parameters: parametersToSend as? [String : AnyObject], encoding: .URL).responseJSON 
    { 
     response in switch response.2 
     { 
     case .Success(let JSON): 
      print(JSON) 
      let response = JSON as! NSDictionary 
      print("My Web Api Response: \(response)") 
      break 
     case .Failure(let error): 
      print("Request failed with error: \(error)") 
      break 
     } 

    } 

} 

Fonction Appel dans votre @IBAction func submitAction (expéditeur: ANYOBJECT) comme celui-ci

@IBAction func submitAction(sender: AnyObject) { 

let steps = stepy.step 
let name = nameLabel.text! 
let age = Int(ageLabel.text!) 
let height = Int(heightLabel.text!) 
let weight = Int(weightLabel.text!) 
let parameters = [ 
     "name": name 
     "age": age 
     "totalStepsCount": steps 
     "heightInMeters": height 
     "weightInKilograms": weight 
     ] 
self.submit(parametersToSend:parameters) 

} 
+0

C'est vraiment génial et vraiment simplifié le code dont j'avais besoin. À l'origine, je ne suis pas un programmeur rapide mais j'ai dû passer à swift parce que le code du kit de santé ne fonctionnerait pas en C# xamarin, donc merci, j'essaierai ça. –

+0

Je reçois une erreur sur cette partie du code Alamofire.request (.POST, "http://www.thisismylink.com/postName.php",parameters: parametersToSend as? [String: AnyObject], codant: .URL) .responseJSON Dit "http://www.thisismylink.com/postName.php" est un argument supplémentaire dans l'appel. –

+0

vous utilisez swift 3 ou swift 4? – Zee