2016-12-03 22 views
1

新しいバージョンのポケモンAPIのJSONデータ、特に "防御"と "攻撃"の値を解析する際に問題があります。それは簡単だったポケモンのAPI v1のではこのJSONポケモン辞書を解析するにはどうすればよいですか? (swift 3)

...ポケモンAPI v2ので

//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) 

私は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) 

私はどのように解析し、 「防衛」の価値は正しくありますか?あなたはその値を取得し、それがdefenseattackでチェックする必要がありますする必要がありますので、ごJSONキーnamedefense & attackは、その値がありましたif name = stat["defense"] {

答えて

0

問題は、この行です。

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

} 

また、このような単一if letbase_statを得るためのコードを減らすことができます。

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

私はiOSの開発に出始めたとき、私は似たようなプロジェクトに取り組んできました。この

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) 

を試してみてください。 最近私は、私のプロジェクトで必要とされる情報のためにJSONを解析するときにlet文を使用すると、guard文を優先します。

また、統計ノードは配列、攻撃、防御、特殊攻撃防御、スピード、HPは変更されないので、switch文がこの場合に適切なツールです。

return文の前にprint文を置き、ガード文のelseブロックで続行して、プログラム内のelseブロックにヒットしたかどうかを確認すると便利です。

+0

私はちょうどスウィフトの初心者です、あなたのソリューションは非常に専門的に見えます、それは私のための新しい知識、良いアドバイスのおかげで。 – Rurom

+0

うれしい私は助けることができました!私たちはどこかで始まります。私のアドバイスは、ガードとスイッチのステートメントを見ています。 JSON解析で非常に便利です – hooliooo

関連する問題