如何在使用AFNetworking时从An Object获取值

时间:2014-09-24 02:59:09

标签: ios swift afnetworking

我在swift的新个人项目中使用了AFNetworking。当我向服务器发布登录请求时,服务器将使用json返回响应,而AFNetworking将json转换为Anyobject。但是当我尝试使用anyobject时,我遇到了一些问题。

以下是登录成功时的json数据:

{"code":0,"data":{"id":"1"}}

这是我的登录代码:

manager.POST("\(SERVER_HOST)User/login", parameters: params, success: { (operation:AFHTTPRequestOperation!, response:AnyObject!) -> Void in
      var code = response.objectForKey("code") as Int

      if code == 0{
         var data = response.objectForKey("data") as NSDictionary
         var id = data.objectForKey("id")?.integerValue

         self.performSegueWithIdentifier("loginSucceed", sender: self)
      }

})

所以我的问题是:代码可以工作,但是当我使用

var id = data.objectForKey("id") as Int

就像我得到代码值的方式,应用程序崩溃,id得到零值。为什么?

另一个问题是:使用更复杂的json字符串获取值的正确方法是什么。 任何帮助将非常感谢

3 个答案:

答案 0 :(得分:0)

你的代码崩溃了:

var id = data.objectForKey("id") as Int

因为"id"对应的值是String "1"而不是Int 1。如果您对类型有误,强制转换as会崩溃。使用条件转换as?并将其与可选绑定结合起来更安全:

if let code = response["code"] as? Int {
    // if we get here we know "code" is a valid key in the response dictionary
    // and we know we got the type right.  "code" is now an unwrapped `Int` and
    // is ready to use.

    if code == 0 {
        if let data = response["data"] as? NSDictionary {
            // if we get here, we know "data" is a valid key in the response
            // dictionary and we know it holds an NSDictionary.  If it were
            // some other type like `Int` we wouldn't have entered this block

            if let id = data["id"] as? String {
                // if we get here, we know "id" is a valid key, and its type
                // is String.

                // Use "toInt()" to convert the value to an `Int` and use the
                // default value of "0" if the conversion fails for some reason
                let idval = id.toInt() ?? 0
                println("idval = \(idval)")
            }
        }
    }
}

答案 1 :(得分:0)

这段代码可能有用。

let json = JSONValue(response)
var code: Int  = json["code"].integer!

if code == 0 {
    if let data = json["data"].object {
       var id = json["data"]["id"].integer!
    }
    self.performSegueWithIdentifier("loginSucceed", sender: self)
}

答案 2 :(得分:0)

经过几个小时的谷歌搜索和搜索github,最后我发现了一个非常有用的工具解析swift中的json。这是链接

https://github.com/SwiftyJSON/SwiftyJSON

任何看过这个问题的人都可以在一些个人项目中使用AlamoFire而不是AFNetworking。

https://github.com/Alamofire/Alamofire

以下是处理AlamoFire和SwiftyJSON的另一个链接

https://github.com/SwiftyJSON/Alamofire-SwiftyJSON