【问题标题】:How to handle JSON response with nil using guard in Swift如何在 Swift 中使用警卫处理 nil 的 JSON 响应
【发布时间】:2017-04-30 17:04:51
【问题描述】:

我只是想问一下如何在 Swift 中处理带有 null 值的 JSON 返回。 我使用guard来解包值,但如果JSON有一个空值,如下例所示,将不会执行guard

我也想知道使用警卫的正确方法。可以在一个守卫中使用多个条件吗?就像我下面的示例代码一样?

{
  "error_code": "0",
  "error_description": [],
  "status": true,
  "results": {
  "id": 25,
  "email": "jaundelacruz@yahoo.com",
  "created_at": "2016-12-10T15:54:03.779Z",
  "updated_at": "2016-12-15T06:41:49.432Z",
  "first_name": "Juan",
  "last_name": "Cruz",
  "middle_name": "Dela",
  "nickname": "joe",
  "option_nickname": null,
  "age": 24,
  "gender": "Male",
  "mobile_number": "639959283721",
  "photo_url": {
  "url": null
  },
  "school": "University of the Philippines",
  "user_address": null,
  "city": "Quezon City",
  "country": null,
  "longtitude": 121.0621301,
  "latitude": 14.5832954,
  "facebook_user_id": null,
  "device_token": null,
  "token": "YrxVEWUMYxieFy7PEsAn",
  "is_sent": false,
  "show_nickname": false
},
"error": []

}

这是我的代码:

func UserLogin(facebookID: String) -> Void {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
    let urlString = Constants.baseURL + Constants.apiURL + Constants.loginUrl
    let params:Dictionary<String, AnyObject> = [
        "facebook_id": facebookID as AnyObject
    ]

    Alamofire.request(urlString, method: .post, parameters: params, encoding: JSONEncoding.default)
        .validate()
        .responseJSON { response in
            switch response.result {
            case .success:
                let userjson = JSON(data: response.data!)
                let results = userjson["results"].dictionaryValue
                guard let auth_token = results["token"]?.string,
                    let userid = results["id"]?.int,
                    let firstname = results["first_name"]?.string,
                    let lastname = results["last_name"]?.string,
                    let nickname = results["nickname"]?.string,
                    let city = results["city"]?.string,
                    let photo = results["photo_url"]?["url"]else{

                        //nil
                    return
                }

                //The Process will not continue from here if the JSON response has a null value)

                self.userdefault.saveUserToken(authToken: auth_token)
                self.userdefault.setUserID(userID: userid)
                self.userdefault.setuserFirstName(userFName: firstname)
                self.userdefault.setuserLastName(userLName: lastname)
                self.userdefault.setuserNickName(userNName: nickname)
                self.userdefault.setuserCity(userCity: city)

                self.GotoMainNavigation()

            case .failure(let error):
                print("susb \(error)")

                self.getFacebookInfo()

            }
            UIApplication.shared.isNetworkActivityIndicatorVisible = false
    }

}

谢谢

【问题讨论】:

    标签: ios json swift null swift3


    【解决方案1】:

    您的guard 表达式非常好,可以过滤除最后一行之外的所有null 值。假设url 也是你必须检查的字符串

    let photo = results["photo_url"]?["url"]?.string ...
    

    但请考虑guard 表达式只有在所有可选绑定成功时才会被评估为真。

    例如,如果 photo 值应该是可选的,请将其放在 保护表达式之后并使用 nil 合并运算符:

    let photo = results["photo_url"]?["url"]?.string  ?? ""
    

    【讨论】:

      【解决方案2】:
       data =     {
              results =         {
                  resultsData =             (
                                      {
                          a = "A";
                          b = "B";
                          c = "C":
                      }
                  );
              };
      };
      

      guard 是一个新的条件语句,如果条件不满足,则需要执行以退出当前块。在保护语句的条件中创建的任何新的可选绑定都可用于函数或块的其余部分,并且强制 else 必须退出当前范围,通过使用 return 离开函数、在循环内继续或中断,或 @noreturn功能

      guard let data = response["data"] as? [String:AnyObject],let resultsObj = response["results"] as? [String:AnyObject],let resultsData = results["resultsData"] as? [String:AnyObject] else{
      
         return
       }
      

      【讨论】:

      猜你喜欢
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多