Pourquoi dois-je obtenir un Code d'erreur=3840 Parsing JSON?
Je suis nouveau sur Swift et de développement iOS en général. Je suis en essais et d'apprendre à les utiliser à distance le serveur de l'api. Je suis JSON à partir d'un Strongloop (Loopback) de l'api lors de la tentative d'authentification et de l'analyse, je suis en train d'utiliser obtient une erreur:
Erreur de Domaine=NSCocoaErrorDomain Code=3840 "L'opération ne pouvait pas être complété. (Cacao erreur 3840.)" (Pas de valeur.) UserInfo=0x7fd623e38870 {NSDebugDescription=Pas de valeur.}
Ici est la valeur de retour dans une chaîne, je suis évidemment obtention d'une bonne réponse JSON à partir de Bouclage, un jeton d'authentification, ttl, la date et l'userId:
{"id":"BHzKnjrbUPn9KSC1GegQTNHJFNwfuifNxpfzukkyxc5iwrdehuerurvsdbmzzrvi","ttl":1209600,"created":"2015-07-03T13:04:39.791 Z","userId":2}
Je pense que le réel problème n'est PAS survenu dans le parseJSON méthode, mais plutôt la performLoginRequestWithURL méthode. Elle retourne une chaîne vide. Quelque chose à voir avec la requête asynchrone. J'ai remarqué que la chaîne json variable n'obtenir qu'après il est retourné à partir de la méthode, donc il s'est retourné vide. Si j'ai mis deux println(json) les méthodes, l'une à l'intérieur de la requête asynchrone et un après elle, l'un après l'imprime en premier. Ce qui est logique dans un sens, mais je ne sais pas comment résoudre ce problème. J'ai besoin d'obtenir le json retourné à partir de la poste, mais je ne sais pas comment faire pour capturer. Quelque chose me dit j'ai besoin d'utiliser un synchrone demande à la place, mais je ne sais pas comment faire, dans ce contexte de prise en json à partir d'une requête POST.
Voici mon code:
//Login button pressed
@IBAction func login() {
//Gets url string
let url = getLogin()
//Posts url with UITextField data.
if let jsonString = performLoginRequestWithURL(url) {
//Error occurs in the parseJSON method
if let dictionary = parseJSON(jsonString) {
/*
if let at = dictionary["id"] as? String {
accesstoken = at
}
if let id = dictionary["userId"] as? Int {
println(id)
}
*/
}
}
}
func getLogin() -> NSURL {
let toEscape = "http://localhost:3000/api/Users/login"
let urlString = toEscape.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
let url = NSURL(string: urlString)
return url!
}
func performLoginRequestWithURL(url: NSURL) -> String? {
let bodyData = "username=\(textEmail.text)&password=\(textPW.text)"
var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
var json = ""
request.HTTPMethod = "POST"
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){
response, data, error in
if data != nil {
json = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
}
println(json)
}
return json
}
func parseJSON(jsonString: String) -> [String: AnyObject]? {
if let data = jsonString.dataUsingEncoding(NSUTF8StringEncoding) {
var error: NSError?
if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: &error) as? [String: AnyObject] {
return json
} else if let error = error {
//Here's where the error comes back.
println("JSON Error: \(error)")
} else {
println("Unknown JSON Error")
}
}
return nil
}
jsonString
dans le parseJSON
méthode et ajouter le à la question.Je pense que quelque chose se passe pour le json renvoyé par le performLoginRequestWithURL méthode. Je pense que l'erreur peut ne pas être dans la façon dont je suis l'analyse, mais plutôt dans ce qui est retournée. Quand je bouge la println(json) vers le bas au-dessus de retour json la variable est soudainement vide à nouveau.
OriginalL'auteur Nathan McKaskle | 2015-07-03
Vous devez vous connecter pour publier un commentaire.
La
parseJSON
méthode doit être appelée à partir de laNSURLConnection.sendAsynchronousRequest
achèvement de bloc, pas juste après la requête asynchrone, il n'est généralement pas de réponse par ce point.Encore fonctionner dans le problème de la façon de retourner la analysée JSON à partir de la méthode globale performLoginRequestWithURL.
Rien retourné à l'intérieur, on obtient une erreur qu'il ne peut pas être converti à vide.
Vous ne pouvez pas. Vous devez structurer votre code tel que vous pouvez gérer la reprendre plus tard. Peut-être envoyer un
NSNotification
ou mettre à jour un modèle de données et de demander une actualisation il doit être affichée. Ouais, asynchrones sont plus difficiles, mais doit être conçue pour. Tae le temps de la lecture et l'étude de la manipulation des appels asynchrones.Je suppose que je peux traiter l'intégralité de la demande de connexion à l'intérieur de ce bloc à l'aide de variables d'instance, plutôt que de retourner quelque chose à l'action login.
OriginalL'auteur zaph
J'ai testé
parseJSON
avec la chaîne à partir de la question et qu'il a réussi, donc l'erreur doit être que la chaîne n'est pas envoyé à laparseJSON
méthode correctement.De sortie:
Certains quelle est la leçon à créer un petit test ou écrire des Tests Unitaires.
Deux choses: println l'erreur et la réponse, la réponse sera la http
statusCode
, techniquement lestatus code is a property of
NSHTTPURLResponse` de sorte que vous pouvez avoir besoin de jeter.Je sais maintenant pourquoi j'obtiens le message d'erreur (voir les modifications sur mon post) mais je suis encore assez coincé. Bref, c'est que je ne sais pas comment obtenir json à partir d'un POSTE. Dans longtemps, je pense que j'ai peut-être besoin d'utiliser un Synchrone demande mais je n'ai pas trouvé de bons exemples de la façon de l'utiliser dans ce contexte.
OriginalL'auteur zaph
OriginalL'auteur Roman Solodyashkin