這是一篇翻譯文章,原文出處:http://www.raywenderlich.com/82706/working-with-json-in-swift-tutorialgit
Swift語言中如何使用JSON數據教程github
JSON(全稱:JavaScript Object Notation),是網絡服務中傳輸數據的經常使用方法,JSON由於容易使用,且可讀性強, 因此很是受到歡迎。json
下面是個JSON的一個片斷:swift
[ {"person": {"name":"Dani","age":"24"}}, {"person": {"name":"ray","age":"70"}} ]
在objective-c 中解析JSON數據至關的簡單:數組
NSString *age = json[0][@"person"][@"age"]; NSLog(@"Dani's age is %@", age);
但在更加現代化的語言swift中, 由於optionals數據類型的緣由,JSON數據解析起來反而要麻煩。安全
if let item = json[0] { if let person = item["person"] { if let age = person["age"] { println(age) } } }
上面的代碼中,每從JSON數據中解析一次就須要經過optional binding檢查,這可讓代碼更加安全,但也讓解析工做變得複雜,若是解析餓更復雜的jsons代碼變的冗餘。網絡
咱們開始一個例子app
下載例子開始程序項目。這個程序是爲了獲取App Store中top25的app.框架
裏面有幾個文件ide
TopApps.json:包含用於json解析的文件
AppModel:表明應用類
DataManager:獲取本地和遠程數據類,使用這個文件裏的方法加載JSON數據。
viewController :目前是空的,待會我門在裏面寫入代碼。
原生的解析JSON數據的方法
在viewController.swift文件中的viewDidLoad()方法添加以下代碼:
DataManager.getTopAppsDataFromFileWithSuccess { (data) -> Void in // 使用optional binding and NSJSONSerialization類獲取排名第一的app //1 var parseError: NSError? let parsedObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error:&parseError) //2 if let topApps = parsedObject as? NSDictionary { if let feed = topApps["feed"] as? NSDictionary { if let apps = feed["entry"] as? NSArray { if let firstApp = apps[0] as? NSDictionary { if let imname = firstApp["im:name"] as? NSDictionary { if let appName = imname["label"] as? NSString { //3 println("Optional Binding: \(appName)") } } } } } } }
運行後的結果:
Optional Binding: Clash of Clans
結合SwiftJSON第三方框架解析JSON數據
首先在github下載SwiftJSON,地址:https://github.com/lingoer/SwiftyJSON 而後 下載文件解壓,而後將目錄中的SwiftJSON.swfit拷貝到項目目錄裏。
替換viewDidLoad()內容:
override func viewDidLoad() { super.viewDidLoad() DataManager.getTopAppsDataFromFileWithSuccess { (data) -> Void in // 使用SwiftyJSON 獲取排名第一的app let json = JSON(data: data) if let appName = json["feed"]["entry"][0]["im:name"]["label"].string { println("SwiftyJSON: \(appName)") } } }
咱們注意首先json()初始化data,並轉換成JSON對象
使用SwiftJSON的好處是,它處理了全部的optional數據類型的檢查,咱們只須要知道json數據的key和索引後,其餘就能夠交給 SwiftJSON來處理。
在上面的代碼中,我門還使用了string方法獲取string 值, SwiftJSON還有個arrayValue來獲取數組。
運行結果:
SwiftyJSON: Clash of Clans
獲取遠程JSON數據
在DataManager.swift中添加下列方法:
class func getTopAppsDataFromItunesWithSuccess(success: ((iTunesData: NSData!) -> Void)) { //1 loadDataFromURL(NSURL(string: TopAppURL)!, completion:{(data, error) -> Void in //2 if let urlData = data { //3 success(iTunesData: urlData) } }) }
而後在viewController.swfit 中viewDidLoad()添加以下方法:
//從iTunes and 並經過SwiftyJSON獲取排名第一的app
DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in let json = JSON(data: iTunesData) if let appName = json["feed"]["entry"][0]["im:name"]["label"].string { println("NSURLSession: \(appName)") } // More soon... }
運行結果:
wiftyJSON: Clash of Clans
NSURLSession: Clash of Clans
解析JSON到array數組
在viewController中More soon 後添加以下內容: //1 if let appArray = json["feed"]["entry"].arrayValue { //2 var apps = [AppModel]() //3 for appDict in appArray { var appName: String? = appDict["im:name"]["label"].stringValue var appURL: String? = appDict["im:image"][0]["label"].stringValue var app = AppModel(name: appName, appStoreURL: appURL) apps.append(app) } //4 println(apps) }
從JSON 數據中遍歷並保存到類型爲appModel的apps數組中。
運行程序:
在真實的程序中,咱們會經過UITableView或者UICollectionView顯示數據。
這就是使用原生類和第三方類庫SwfitJSON解析JSON數據的方法。