如何在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) } }
當我們執行這段程式碼時,我們將得到以下輸出。
廣告