2017-09-02 103 views
1

我試圖從這個JSON鏈接中獲取NHL的所有31個團隊。下面來看看哪些文件看起來像:Parse JSON Swift 3詞典

{ 
    "sports":[ 
     { 
     "name":"hockey", 
     "slug":"hockey", 
     "id":70, 
     "uid":"s:70", 
     "leagues":[ 
      { 
       "name":"National Hockey League", 
       "slug":"nhl", 
       "abbreviation":"nhl", 
       "id":90, 
       "uid":"s:70~l:90", 
       "groupId":9, 
       "shortName":"NHL", 
       "teams":[ 
        { 
         ...team info.... 
        }...... 

我現在有這樣做的聲明在功能上「隊」陣中試圖環通的所有31項:

if let parsedData = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary { 
    if let entries: NSArray = parsedData["sports"] as! NSArray { 
     for entry in entries { 
      //work with data 
     } 
    } 
} 

我知道我必須深入研究「if let entry」行,但我似乎無法獲得我想要的數據。提前致謝。

+0

提示:'parsedData [「sports」]'是一個數組,不是字典。 – rmaddy

+0

我剛換了一下我的代碼。獲得了條目行,但我不能深入到「體育」數組中的「聯盟」數組 –

+1

不要在Swift中使用NSDictionary和NSArray。 – rmaddy

回答

1

首先,爲什麼這麼多的教程建議/人使用.mutableContainers雖然對象是永遠不會發生突變而具有諷刺意味的結果主要是分配給IM可變對象?

不要那樣做。通過沒有選項通過省略參數。

其次不要打Swift的強類型系統。使用本地收集類型ArrayDictionary,不要註釋編譯器可以推斷的類型。

突然想到創建一個類型別名爲方便起見:

typealias JSONDictionary = [String:Any] 

if let parsedData = try JSONSerialization.jsonObject(with: data!) as? JSONDictionary, 

關鍵sports的值是數組(通過[]表示)

let sports = parsedData["sports"] as? [JSONDictionary] { 

枚舉陣列和獲取密鑰的值leagues這也是一個陣列

 for sport in sports { 
      print("sport ", sport["name"] as? String ?? "n/a") 
      if let leagues = sport["leagues"] as? [JSONDictionary] { 

做同樣的leagues,並獲得teams

   for league in leagues { 
       print("league ", league["name"] as? String ?? "n/a") 
       if let teams = league["teams"] as? [JSONDictionary] { 
       for team in teams { 

解析JSON是很容易的,只有兩種集合類型和四個值類型。

   } 
      } 
      } 
     } 
    } 
} 
+0

工作!謝謝! –