我在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字符串获取值的正确方法是什么。 任何帮助将非常感谢
答案 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的另一个链接