【问题标题】:Parse JSON Swift 3 Dictionary解析 JSON Swift 3 字典
【发布时间】:2017-09-02 04:58:06
【问题描述】:

我正在尝试通过此 JSON 链接获取 NHL 的所有 31 支球队。下面看一下文件的样子:

{
   "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....
                  }......

我目前在函数中有这个 do 语句,试图遍历“团队”数组中的所有 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
        }
     }
}

我知道我必须更深入地研究“如果让条目”行,但我似乎无法获得我想要的数据。提前致谢。

【问题讨论】:

  • 提示:parsedData["sports"] 是一个数组,而不是字典。
  • 我只是稍微改变了我的代码。让条目行开始工作,但我无法更深入地了解“体育”数组中的“联赛”数组
  • 不要在 Swift 中使用 NSDictionaryNSArray

标签: json swift parsing dictionary swift3


【解决方案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 非常简单,只有两种集合类型和四种值类型。

                }  
             }
          }
      }
   }
}

【讨论】:

  • @CalebRudnicki 如果这解决了你的问号,则将答案标记为正确
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多