我在解析来自Pokemon API新版本的JSON数据时遇到了问题,特别是“防御”和“攻击”的值。
在口袋妖怪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)请告知,我如何正确地解析和获得“防御”的价值?
发布于 2016-12-03 06:46:53
问题是,在这一行中,if name = stat["defense"] {您的JSON有键name,而defense & 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)")
}发布于 2016-12-03 06:55:46
尝尝这个
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以获取我的项目所需的信息时,我更喜欢保护let语句而不是if let语句。
我还假设由于stats节点是一个数组,攻击、防御、特殊攻击、特殊防御、速度和HP的顺序不会改变,所以在这种情况下,switch语句是一个合适的工具。
在返回之前放置一个print语句,然后继续在卫士语句的其他块中查看是否击中了程序中的其他块,这也可能是有帮助的。
https://stackoverflow.com/questions/40945016
复制相似问题