2017-02-23 101 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) 
        } 
       } 
      }   
     } 
    } 
}