2016-12-03 71 views
1

我从口袋妖怪API的新版本解析JSON数据的问题,特别是与“防守”和“进攻”的值。如何解析这个JSON口袋妖怪字典? (SWIFT 3)

在口袋妖怪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) 

在口袋妖怪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) 

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

回答

0

的问题是在这条线if name = stat["defense"] {JSON具有关键namedefense & attack有它的价值,所以你需要得到它的价值和需要检查是不是defenseattack

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

} 

您还可以减少患上base_statif let像这样的代码。

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

现在工作吗? –

+0

简单明了的答案,初学者可以理解,谢谢你的帮助。 – Rurom

+0

老实说,我会接受这两个答案,因为他们都很好,每个都以自己的方式,这是可惜的,这是不可能的。 – Rurom

0

试试这个

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开发开始了我在一个类似的项目工作。 这几天我更喜欢让let语句结束如果让语句解析JSON来获取我的项目中所需的信息

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

它还可能有助于把一个print语句返回之前,继续在中后卫的语句else块,看看你在程序中打击的其他块。

+0

我只是Swift的初学者,您的解决方案看起来非常专业,对我来说这是新知识,感谢您的好建议。 – Rurom

+0

很高兴能帮到你!我们都从某个地方开始。我的建议是看看守卫和交换声明。它们在JSON解析中非常有用 – hooliooo