2017-02-27 120 views
-1

字典的數組的我想獲得的數據進行嵌套字典的數組,它是一個JSON響應的結果。獲取數據了從JSON響應

func fetchData() { 
    let urlString = "https://global.api.pvp.net/api/lol/static-data/na/v1.2/champion?api_key=\(self.apiKey)" 
    let url = URL(string: urlString) 

    URLSession.shared.dataTask(with:url!) { (data, response, error) in 
     if error != nil { 
      print(error ?? "ERROR!") 
     } else { 
      do { 

       let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:Any] 
       print(parsedData) 
       print(parsedData["type"] ?? "") 
       print(parsedData["version"] ?? "") 

       print(type(of: parsedData)) 
       print(type(of: parsedData["data"]!)) 


       //ERROR HERE. 
       //"Cannot subscript a value of type '[String, Any]' with an index of type '(String, (String, Any).Type)' 
       let innerItem = parsedData["Aatrox", (String, Any)] 





      } catch let error as NSError { 
       print(error) 
      } 
     } 

    }.resume() 

這裏是打印的內容:

["type": champion, "version": 7.4.3, "data": { 
Aatrox =  { 
    id = 266; 
    key = Aatrox; 
    name = Aatrox; 
    title = "the Darkin Blade"; 
}; 
Ahri =  { 
    id = 103; 
    key = Ahri; 
    name = Ahri; 
    title = "the Nine-Tailed Fox"; 
}; 
Akali =  { 
    id = 84; 
    key = Akali; 
    name = Akali; 
    title = "the Fist of Shadow"; 
}; 
Alistar =  { 
    id = 12; 
    key = Alistar; 
    name = Alistar; 
    title = "the Minotaur"; 
}; 
}] 

champion 
7.4.3 

Dictionary<String, Any> 
__NSDictionaryI 

我試圖獲得 「ID」 爲 「Aatrox」。

我怎麼會去這樣做?
是否因爲parsedData [「data」]的類型!是__NSDictionaryI?

感謝您的幫助。

回答

2

首先,你需要提取data詞典然後訪問其他字典。

do { 
    let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] 
    if let passDic = parsedData["data"] as? [String:Any], 
     let innerItem = passDic["Aatrox"] as? [String: Any] { 
      print(innerItem) 
    } 

} catch { 
    print(error) 
} 
+0

謝謝!那工作。 – Changerrs

+0

@Changerrs歡迎隊友:)你也可以遍歷passDic來訪問所有的嵌套字典。 –

+0

感謝brotha,我不是告知解析編譯器[「數據」]的類型(不知道正確的IM說這句話)[字符串:任何]的。這是我失蹤的部分。 – Changerrs

0

好像應該是let innerItem: [String: Any] = parsedData["Aatrox"]

+0

嗯..有點接近。它正在編譯。但崩潰在運行時 致命錯誤:意外發現零而展開的可選值 parsedData有3項,[類型,版本,數據] ,我應該做這樣的事情?: 讓innerItem:[字符串:任何] = parsedData [ 「數據」] [ 「Aatrox」] – Changerrs

+0

你必須提取'parsedData [ 「數據」]'到另一個字典第一則與此 – Tj3n

+0

VAR newDataDict = parsedData [ 「數據」]用它 讓innerItem:字符串:任何] = newDataDict [ 「Aatrox」] 仍然得到錯誤:「類型 '否?'有沒有標承包商,客人」 – Changerrs

0
let data : [string:Any] = parsedData.value(key: "data") 
let aatrox : [string:Any] = data["Aatrox"] 
print("**id**\(aatrox["id"])") 

這件事爲我工作..