2017-09-02 65 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

工作!谢谢! –