【问题标题】:How can I parse this JSON Pokemon Dictionary? (swift 3)如何解析这个 JSON 口袋妖怪字典? (迅速 3)
【发布时间】:2016-12-03 06:40:48
【问题描述】:

我在解析来自新版 Pokemon API 的 JSON 数据时遇到问题,特别是“防御”和“攻击”的值。

在 Pokemon API v1 中这很容易......

//JSON:
"attack": 45,
"defense": 65

//After parsing in Alamofire i'm got the next solution:
if let dict = response.result.value as? Dictionary<String, AnyObject> {

            if let attack = dict["attack"] as? Int {
                self._attack = attack
            }

            if let defense = dict["defense"] as? Int {
                self._defense = defense
            }
            print(self._attack)
            print(self._defense)

在 Pokemon API v2 我有 JSON 格式的问题

//JSON:
"stats": [

    {
        "stat": {
            "url": "http://pokeapi.co/api/v2/stat/3/",
            "name": "defense"
        },
        "effort": 0,
        "base_stat": 45
    },
    {
        "stat": {
            "url": "http://pokeapi.co/api/v2/stat/2/",
            "name": "attack"
        },
        "effort": 0,
        "base_stat": 65
    }
]

我试过这个选项,但它不起作用:

 if let stats = dict["stats"] as? [Dictionary<String, AnyObject>], stats.count > 0 {
         if let stat = stats[0]["stat"] as? Dictionary<String, String>{
                    if name = stat["defense"] {
                      if let defense = stats[0]["base_stat"] as? Int {
                            self._defense = defense
                            }
                        }
                      }
                    }
       print(self._defense)

请指教,如何正确解析并获取“防御”的值?

【问题讨论】:

    标签: json parsing dictionary swift3


    【解决方案1】:

    问题出在这一行if name = stat["defense"] {你的JSON有键namedefense&attack是它的值,所以你需要得到它的值并且需要检查它是defense还是attack.

    if name = stat["name"] as? String, name == "defense" {
    
    }
    

    你也可以像这样用单个if let减少获取base_stat的代码。

    if name = stat["name"] as? String, let score = stats[0]["base_stat"] as? Int, name == "defense" {
         print("defense : \(score)")
    }
    

    【讨论】:

    • 简单明了的答案,初学者可以理解,谢谢帮助。
    • 老实说,我会接受这两个答案,因为它们都很好,各有各的方式,可惜这是不可能的。
    • @Rurom 您可以接受任何您想要的答案,我的意思是您的旧代码遇到问题,因为您访问的是错误的密钥而不是正确的密钥,这是我的建议: )
    • 完全正确,您准确地指出了我的错误并提供了帮助,我很感激。感谢帮助! :)
    【解决方案2】:

    试试这个

    guard let statsNode = dict["stats"] as? [[String: Any]] else { return }
    
    for (index, statNode) in statsNode.enumerated() {
    
        guard let statValue = statNode["base_stat"] as? Int else { continue }
    
        switch index {
            case 0:
                self._defense = statValue
            case 1:
                self._attack = statValue
            case 2:
                self._someStat = statValue
            ....
            default:
                break
        }
    
    }
    print(self._attack)
    print(self._defense)
    

    当我开始从事 iOS 开发时,我曾参与过一个类似的项目。 这些天来,在解析 JSON 以获取我的项目所需的信息时,我更喜欢使用 guard let 语句而不是 if let 语句

    我还假设由于 stats 节点是一个数组,因此攻击、防御、特殊攻击、特殊防御、速度和 HP 的顺序不会改变,因此 switch 语句是在这种情况下使用的合适工具。

    在 return 之前放置一个 print 语句并在保护语句的 else 块中继续以查看您是否在程序中遇到了这些 else 块也可能会有所帮助。

    【讨论】:

    • 我只是 Swift 的初学者,你的解决方案看起来很专业,对我来说是新知识,谢谢你的建议。
    • 很高兴能帮上忙!我们都从某个地方开始。我的建议是研究守卫和开关语句。它们在 JSON 解析中非常有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2020-06-10
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多