2017-09-13 2 views
1

Ma réponse JSON à postman ressemble à ceci ...Problème avec json parsing en utilisant Alamofire

{ 
    "success": 1, 
    "Details": { 
     "seller_id": "165", 
     "mobile_no": "9653265987", 
     "seller_name": "User A", 
     "seller_email_id": "[email protected]", 
     "company_name": "myCompany", 
     "category": "Cosmetics", 
     "otp": "1111" 
    }, 
    "message": "Seller Already Registered!!!" 
} 

Maintenant, je voulais donner une condition fondée sur si le succès est 0 ou 1 et donc pour que je voulais extraire Succès. Aussi, je veux extraire le numéro de téléphone mobile. Mais je ne suis pas capable de comprendre comment faire ça.

Voilà comment je fais ma demande de poste Alamofire ...

Alamofire.request(url, method: .post, parameters: Parameters, encoding: URLEncoding.httpBody, headers: headers) 
      .responseString { (response) in 

       if let httpResponse = response.response { 
        print("error \(httpResponse.statusCode)") 

        if httpResponse.statusCode == 200 { 
         //Do something 

        } 
       } 
     } 

Je ne passe par des questions similaires soulevées par d'autres utilisateurs ... mais n'a pas pu trouver d'eux une solution exacte pour mon problème ...

+0

utilisez-vous des tiers pour la sérialisation des données comme swiftyjson ou gloss ..? –

+0

Non..juste Alamofire .. –

Répondre

0

Il y a quelques problèmes:

  1. Vos paramètres à request ne semblent pas tout à fait correct.

    • le paramètre parameters ne semble pas correcte: au mieux, il est très étrange d'avoir une variable Parameters (vous devez utiliser les minuscules pour les variables, et ce conflit avec un type Alamofire); Le codage doit être URLEncoding.default. Ou, parce que URLEncoding.defaultest la valeur par défaut, vous pouvez omettre cela tout à fait.

  2. Si vous voulez vérifier le code d'état, laissez validate faire pour vous. Si vous attendez JSON en réponse, utilisez reponseJSON au lieu de responseString.

  3. Utilisez if let ou guard let avec as? pour dérouler en toute sécurité les options. N'utilisez pas as! (sauf si vous êtes sûr à 100% qu'il ne pourra jamais échouer ... et lorsque vous traitez des réponses d'un serveur distant, vous ne pouvez jamais avoir confiance à 100%).

Ainsi:

func performRequest(url: String, parameters: [String: String]?, headers: [String: String]?) { 
    Alamofire.request(url, method: .post, parameters: parameters, headers: headers) 
     .validate(statusCode: 200 ..< 300) 
     .responseJSON { response in 
      switch response.result { 
      case .success(let value): 
       guard let dictionary = value as? [String: Any], 
        let success = dictionary["success"] as? Int else { 
         print("success not found") 
         return 
       } 

       guard success == 1 else { 
        print("web service reported failure") 
        return 
       } 

       guard let details = dictionary["Details"] as? [String: Any] else { 
        print("Did not find details") 
        return 
       } 

       guard let mobile = details["mobile_no"] as? String else { 
        print("mobile not found") 
        return 
       } 

       print(mobile) 

      case .failure(let error): 
       print("Failed: \(error)") 
      } 
    } 
} 

Ou, dans votre commentaire ci-dessous, si vous voulez goToSignUpScreen() si success était 0, alors:

Alamofire.request(url, method: .post, parameters: parameters, headers: headers) 
    .validate(statusCode: 200 ..< 300) 
    .responseJSON { response in 
     switch response.result { 
     case .success(let value): 
      guard let dictionary = value as? [String: Any], 
       let success = dictionary["success"] as? Int else { 
        print("success not found") 
        return 
      } 

      if success == 0 { 
       self.goToSignUpScreen() 
      } 
     case .failure(let error): 
      print("Failed: \(error)") 
     } 
} 
+0

La solution est apt, @Rob. Mais j'avais un doute ... c'est simple à coup sûr ... :) mais s'il vous plaît considérez cela comme quelque chose d'un débutant. Le doute est-ce .. vous avez mentionné cette ligne laisser le succès = dictionnaire ["succès"] comme? Int else {... Maintenant, si je veux donner ceci ... si let result = response.result.value as? [String: Any] { si résultat ["succès"] as! Int == 0 { self.gotToSignUpScreen() } alors comment vais-je le mentionner dans la déclaration de garde? –

+0

Tout d'abord, pourquoi aller à 'response.result.value' plutôt que d'utiliser la' value' que '.success (let value)' fourni? Deuxièmement, pourquoi utiliser "as!" Au lieu de "as?"? N'utilisez '! 'Que si votre application plante brutalement si la distribution échoue (c'est-à-dire que vous savez que cela ne se produit pas). Mais si vous voulez 'goToSignUpScreen' si' success' était nul, vous pouvez certainement le faire, comme montré ci-dessus. – Rob

+0

Merci @Rob pour avoir clarifié ... –

2

Essayez cette

Alamofire.request(url, method: .post, parameters: Parameters, encoding: URLEncoding.httpBody, headers: headers) 
      .responseJSON { (response) in 

       switch response.result{ 
       case .success(_): 
        print("Success: \(response)") 
        let JsonResponse = response.result.value as? [String: Any] 

        if JsonResponse?["success"] as! Int == 1{ 
         let dict = JsonResponse?["Details"] as! [String : Any] 
         let mobileNo = dict["mobile_no"] as! String 
        } 
        else{ 
         print("Failed") 
        } 

       case .failure(let error): 
        print("Failed: \(error)") 
       } 
     } 
+0

Dans cette ligne, laissez JsonResponse = response.result.value comme? [String: Any], je reçois l'avertissement '' cast from String? au type sans rapport [String: Any] échoue toujours '' .. Et c'est peut-être à cause de cela, dans la ligne suivante, il se bloque ... –

+0

Ok, ... @ Rob ... alors ce qui peut être un bon corriger dans ce cas ... –

+0

@ User.bw essayer mon code mis à jour. –