2017-09-13 45 views
1

在邮递员我的JSON响应看起来像这样解析JSON ...问题用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!!!" 
} 

现在我想给基于成功是0还是1和条件所以,我想提取成功。我也想提取手机号码。但我无法弄清楚如何做到这一点。

这是我想提出我的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 

        } 
       } 
     } 

我没有去通过其他用户提出类似的问题...但无法从他们身上找到了我的问题的精确解...

+0

您使用任何第三方用于像swiftyjson或光泽数据的序列化..? –

+0

No..just Alamofire .. –

回答

0

有几个问题:

  1. 您的参数到request看起来不太正确。

    • parameters参数看起来不正确的:在最好的,这是很奇怪有Parameters变量(你应该使用变量小写;并与Alamofire类型相冲突);编码应为URLEncoding.default。或者,因为URLEncoding.default的默认值,您可以完全忽略它。

  2. 如果您要检查状态代码,让validate为你做的。

  3. 如果您期待JSON作为回应,请使用reponseJSON而不是responseString

  4. 使用if letguard letas?安全地打开可选项。不要使用as!(除非您100%确定它永远不会失败......并且在处理来自远程服务器的响应时,您绝不会100%自信)。

这样:

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)") 
      } 
    } 
} 

或是在下面的评论,如果你想goToSignUpScreen()如果success0,则:

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

该解决方案适用于@Rob。但我有一个疑问..它很简单,肯定... :)但请考虑它是从初学者的东西。怀疑是这个..你提到这条线让成功=字典[“成功”]为?诠释其他{...现在在这里,如果我想给这个...如果让结果= response.result.value为? [String:Any] { if result [“success”] as! Int == 0 { self.gotToSignUpScreen() } 那么我怎么在guard语句中提到它呢? –

+0

首先,为什么要使用'response.result.value'而不是使用'.success(let value)'提供的'value'?其次,为什么使用'as!'而不是'as?'?如果转换失败(如果你知道它不会发生),那么只有在你的应用程序崩溃时才使用'!'。但是如果你想'goToSignUpScreen'如果'成功'为零,你当然可以做到这一点,如上所示。 – Rob

+0

感谢@Rob澄清... –

2

试试这个

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

在这一行让JsonResponse = response.result.value as? [字符串:任何],我收到警告''从字符串转换?到无关的类型[字符串:任何]总是失败''..也许正因为如此,在接下来的一行,它崩溃... –

+0

好吧,... @罗布...所以什么可以是一个适当的修复在这种情况下... –

+0

@ User.bw尝试我更新的代码。 –