Swift語言中如何使用JSON數據教程


這是一篇翻譯文章,原文出處: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 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數據的方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM