首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何解析这个JSON口袋妖怪词典?(swift 3)

我如何解析这个JSON口袋妖怪词典?(swift 3)
EN

Stack Overflow用户
提问于 2016-12-03 06:40:48
回答 2查看 444关注 0票数 1

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

在口袋妖怪API v1中很容易.

代码语言:javascript
复制
//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格式的问题

代码语言:javascript
复制
//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
    }
]

我试过这个选择,但没有用:

代码语言:javascript
复制
 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)

请告知,我如何正确地解析和获得“防御”的价值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-03 06:46:53

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

代码语言:javascript
复制
if name = stat["name"] as? String, name == "defense" {

}

您还可以使用这样的单个base_stat减少获取if let的代码。

代码语言:javascript
复制
if name = stat["name"] as? String, let score = stats[0]["base_stat"] as? Int, name == "defense" {
     print("defense : \(score)")
}
票数 0
EN

Stack Overflow用户

发布于 2016-12-03 06:55:46

尝尝这个

代码语言:javascript
复制
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语句,然后继续在卫士语句的其他块中查看是否击中了程序中的其他块,这也可能是有帮助的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40945016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档