如何在iPhone/iOS中解析JSON物件?


JSON代表Javascript物件表示法。大多數情況下,在處理API或其他服務時,資料以JSON格式返回,我們需要將其轉換為可用且受支援的語言格式。

iOS的基礎框架提供了一個JSONSerialization類,用於將JSON轉換為受支援的格式,例如字典、字串、布林值等。

JSONSerialization類提供了一個方法jsonObject(with:options:),它解析JSON並返回Any作為結果,如果資料無法解析,則返回一個錯誤。

// Example JSON:
/*
{
   "age": 42.0,
   "name": {
      "firstName": “tut”
   }
}
*/

讓我們透過另一個例子來看一下,假設我們從API呼叫中獲得了資料,現在要解析這個資料,我們將使用JSONSerialization.jsonObject(with:options:)

if let data = data, let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { }

// 現在上面的JSON物件包含接收到的資料,作為一個字串和Any的字典,或者它會跳出if let塊到else

// 假設json包含一個鍵“Student”,並且與之關聯的值是一個字典

guard let student = json[“Student”] as? [String: Any] else { return }

這就是我們解析JSON並從中獲取值的方法。我們可以使用模型和初始化器進一步增強這一點。讓我們透過建立一個本地JSON檔案然後嘗試解析它來看一個例子。

讓我們建立一個包含以下資料的JSON檔案,並將其儲存為exercises.json

{
   "Warmup": {
      "Exercises": [
         {
            "Name": "Neck Strech",
            "images": [
               "http:sdf.com",
               "sdf",
               "sdf",
               "sdf"
            ],
          "time": 30
         }
      ]
   }
}

我們現在將解析這個本地JSON並使用以下程式碼列印結果:

if let filePath = Bundle.main.path(forResource: "exerciseData", ofType: "json") {
   do {
      let data = try Data(contentsOf: URL(fileURLWithPath: filePath), options: .mappedIfSafe)
      let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
      if let exercises = jsonResult as? [String:AnyObject] {
         if let warmups = exercises["Warmup"] as? [String:AnyObject] {
            print(warmups)
         }
      }
   } catch {
      print(error.localizedDescription)
   }
}

當我們執行這段程式碼時,我們將得到以下輸出。

更新於:2020年6月27日

475 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告