2017-02-23 99 views
0

我正在访问带有预先生成的JSON输出的CMS,它使用以下数据结构。我正在努力进入嵌套集合以获取版本或循环的类别。Swift和访问嵌套的JSON集合

{ 
    results: [ 
     { 
      pageData: { 
       info: { 
        version: "1" 
       }, 
       categories: [ 
        { 
         name: "Cat 1" 
        }, 
        { 
         name: "Cat 2" 
        } 
       ] 
      } 
     } 
    ] 
} 

这是我试图使用的代码。任何帮助表示赞赏!

guard let json = json, let results = json["results"], let pageData = results["pageData"], let info = pageData["info"] as? [String:Int], let version = info["version"], 
    let categories = Category.getCategories(json: json) else { 
    self.completionParse(RequestResult.errorParsing, self.categoriesResult) 
    return 
} 
+0

您的代码表明您了解如何挖掘字典以获取所需的数据。你有什么问题试图获得稍微不同的数据? – rmaddy

+0

@rmaddy如果我删除结果和pageData集合,并将信息和类别集合带到顶层,则上面的代码可以工作。如果我继续让排序,并尝试从结果开始,并走出错误,似乎并没有工作。试图确定是否有更好的方法来诚实地做到这一点。 – jeremykrall

+0

你忽略了包含实际数据的“结果”和“页面数据”字段。 –

回答

3

要访问infocategories字典就需要第一接入results阵列和pageDataresults阵列的第一对象物的内部。

guard let json = json, let results = json["results"] as? [[String:Any]], 
    let firstDic = results.first, let pageData = firstDic["pageData"] as? [String:Any], 
    let info = pageData["info"] as? [String:Int], let version = info["version"], 
    let categories = Category.getCategories(json: pageData) else { 

    self.completionParse(RequestResult.errorParsing, self.categoriesResult) 
    return 
} 
+0

现在工作吗? –

+0

这让我走上了正确的道路,非常感谢您的帮助。 – jeremykrall

+0

@jeremykrall不要让你不能得到'版本'和'类别'与我的解决方案或我错过了什么? –

0

测试代码在操场上。此代码是最新的快速3.

if let dictResponse = json as? [String:Any] { 
    // This will get entire dictionary from your JSON. 
    if let results = dictResponse["results"] as? [[String:Any]]{ 
     if let pageData = results.first? ["pageData"] as? [String:Any]{ 
      if let info = pageData["info"] as? [String:Any]{ 
       if let version = info["version"] as? String{ 
        print(version) 
        // This will print 1 
       } 
      } 

      if let categories = pageData["categories"] as? [[String:Any]]{ 
       // This will give you a category array. Later on you can iterate and get the dictionary’s value of each element. 
       for categoriesObj in categories.enumerated(){ 
        if let name = categoriesObj.element["name"]{ 
         print(name) 
        } 
       } 
      }   
     } 
    } 
}