【问题标题】:Get data out of array of dictionaries from JSON response从 JSON 响应中获取字典数组中的数据
【发布时间】:2017-07-17 14:07:49
【问题描述】:

我正在尝试从作为 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

我正在尝试获取“Aatrox”的“id”。

我该怎么做呢?
是不是因为parsedData["data"]的类型!是__NSDictionaryI??

感谢您的帮助。

【问题讨论】:

    标签: ios json swift dictionary swift3


    【解决方案1】:

    好像应该是let innerItem: [String: Any] = parsedData["Aatrox"]

    【讨论】:

    • 嗯.. 再靠近一点。它正在编译。但在运行时崩溃致命错误:在展开可选值时意外发现 nil parsedData 有 3 个项目,[type, version, data] 我应该做类似的事情吗?:let innerItem: [String: Any] = parsedData["data"] [“亚托克斯”]
    • 您必须先将parsedData["data"] 提取到另一个字典中,然后再与它一起使用
    • var newDataDict = parsedData["data"] let innerItem: [String: Any] = newDataDict["Aatrox"] 仍然出现错误:“Type 'Any?'没有下标成员"
    • var newDataDict: [String:Any] 应该可以工作,您必须为其指定类型:D
    【解决方案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)
    }
    

    【讨论】:

    • @Changerrs Welcome mate :) 你也可以通过 passDic 循环访问所有嵌套字典。
    • 感谢兄弟,我没有告诉编译器 parsed["data"] 是类型(不确定我说的是否正确)[String:Any]。这是我缺少的部分。
    • @Changerrs 它发生了,欢迎朋友 :)
    【解决方案3】:
    let data : [string:Any] = parsedData.value(key: "data")
    let aatrox : [string:Any] = data["Aatrox"]
    print("**id**\(aatrox["id"])") 
    

    这东西对我有用..

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      相关资源
      最近更新 更多