在OC中解析json数据我一般用iOS5之后自带的NSJSONSerialization,转为字典或数组再取值。
在Swift中,因为Swift强调类型安全,属性上多了可选类型(optional),使用NSJSONSerialization获取jsonObject后,需要繁琐地downcast,SwiftJson的一个例子
let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(dataFromTwitter, options: NSJSONReadingOptions.MutableContainers, error: nil)
if let statusesArray = jsonObject as? NSArray{
if let aStatus = statusesArray[0] as? NSDictionary{
if let user = aStatus["user"] as? NSDictionary{
if let userName = user["name"] as? NSDictionary{
//Finally We Got The Name
}
}
}
}
或者可选链式调用
let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(dataFromTwitter, options: NSJSONReadingOptions.MutableContainers, error: nil)
if let userName = (((jsonObject as? NSArray)?[0] as? NSDictionary)?["user"] as? NSDictionary)?["name"]{
//What A disaster above
}
解决办法:SwiftJson https://github.com/pvwoods/SwiftyJSON
let json = JSONValue(dataFromNetworking)
if let userName = json[0]["user"]["name"].string{
//Now you got your value
}
let json = JSONValue(dataFromNetworking)
if let userName = json[999999]["wrong_key"]["wrong_name"].string{
//Calm down, take it easy, the ".string" property still produces the correct Optional String type with safety
}
SwiftJson是一个枚举类型,内部也是使用NSJSONSerialization解析,当使用key来获取一个json对象,如果获取失败就返回JInvalid,直到最后调用.string .number .bool拆包才返回nil,就算中间获取出错也不会crash。