大多数人的做法是将烦人的 JSON 数据解析为自定义对象。这应该在您获得 JSON 后立即完成。理想情况下,不应在通信代码之外使用 JSON 格式的数据,例如:
首先,让我们定义一个类来保存您的服务器数据:
class MyServerObject {
let typeId: Int
let typeName: String
let dataList: [AnyObject]?
init(dictionary: Dictionary<String, AnyObject>) {
let dataDictionary = dictionary["data"] as! Dictionary<String, AnyObject>
self.typeId = dataDictionary["TypeId"] as! Int
self.typeName = dataDictionary["TypeName"] as! String
self.dataList = dataDictionary["DataList"] as? [AnyObject]
}
}
请注意,init 方法已经在解析 JSON。这不必在init 中完成,您也可以创建一个静态的parse 方法,该方法将返回一个新实例。
用法:
// demo data
let jsonString = "{\"data\": {\"TypeId\":7,\"DataList\":null,\"TypeName\":\"This is a test\"}}"
let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
let json = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
// parsing
let myServerObject = MyServerObject(dictionary: json as! Dictionary<String, AnyObject>)
// now we can simply read data as properties
print(myServerObject.typeId)
print(myServerObject.typeName)
这个解决方案的一个好处是我们可以检查 JSON 格式并且所有属性都被解析为正确的类型。
解析可以是分层的,例如,如果你的dataList包含复杂的对象,我们称它们为DataListItem,你的解析方法可以单独解析每个项目并将它们放入[DataListItem],例如
if let dataListJSON = dataDictionary["DataList"] as? [Dictionary<String, AnyObject>] {
self.dataList = dataListJSON.map({ DataListItem($0) })
}
还要注意,在解析as!时,格式无效时会导致应用崩溃。如果类型不匹配,as? 将返回 nil。 as? 对于可以是 nil 的类型非常有用,因为它们被解析为 NSNull 实例。