Swift語言中如何使用JSON資料教程

來源:互聯網
上載者:User

標籤:

這是一篇翻譯文章,原文出處:http://www.raywenderlich.com/82706/working-with-json-in-swift-tutorial

 

Swift語言中如何使用JSON資料教程

 

JSON(全稱:JavaScript Object Notation),是網路服務中傳輸資料的常用方法,JSON因為容易使用,且可讀性強, 所以非常受到歡迎。

 

下面是個JSON的一個片段:

[  {"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 Store中top25的app.

裡面有幾個檔案

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 ClansNSURLSession: Clash of Clans

 

 

 

 

解析JSON到array數組

 

在viewController中More soon  後添加如下內容: //1if 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資料的方法。

 

Swift語言中如何使用JSON資料教程

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.