我从新版Pokemon API解析JSON数据时遇到问题,特别是"防御"的值。和#34;攻击"。
在Pokemon API v1中很容易......
_.each(userData, function(data, index) {
data.age = userAge[index].age;
});
在Pokemon API v2中,我有 JSON格式的问题:
//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:
"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
}
]
请告知,我如何解析并获得&#34;防御&#34;的价值?正确?
答案 0 :(得分:0)
问题出在这一行if name = stat["defense"] {
,JSON
有密钥name
和defense
&amp; attack
是其值,因此您需要获取其值,并且需要检查它是defense
还是attack
。
if name = stat["name"] as? String, name == "defense" {
}
您也可以像这样减少使用单base_stat
获取if let
的代码。
if name = stat["name"] as? String, let score = stats[0]["base_stat"] as? Int, name == "defense" {
print("defense : \(score)")
}
答案 1 :(得分: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 let语句来解析JSON以解析我的项目中需要的信息
我还假设因为stats节点是一个数组,攻击,防御,特殊攻击,特殊防御,速度和HP的顺序不会改变所以switch语句是在这种情况下使用的合适工具。
在返回之前放置一个print语句并继续在guard语句的else块中查看你是否点击了程序中的其他块也可能会有所帮助。