2017-02-27 180 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"])") 

这件事为我工作..