【问题标题】:How do I Decode this JSON in Swift 4我如何在 Swift 4 中解码这个 JSON
【发布时间】:2020-12-19 13:22:57
【问题描述】:

我有这个需要解码的 JSON 响应,但我只需要它的某些属性。我想获取传奇的名字和他们在传奇上的击杀数量。为了让解码器正常工作,我如何按图例模型构造?

`

"legends": {
    "selected": {
        "LegendName": "Pathfinder",
        "data": [
            {
                "name": "Season 5 Kills",
                "value": 757,
                "key": "kills_season_5"
            },
            {
                "name": "Kills",
                "value": 1140,
                "key": "kills"
            }
        ],
        "ImgAssets": {
            "icon": "https:\/\/api.mozambiquehe.re\/assets\/icons\/pathfinder.png",
            "banner": "https:\/\/api.mozambiquehe.re\/assets\/banners\/pathfinder.jpg"
        }
    },
    "all": {
        "Pathfinder": {
            "data": [
                {
                    "name": "Kills",
                    "value": 1140,
                    "key": "kills"
                },
                {
                    "name": "Damage",
                    "value": 257532,
                    "key": "damage"
                },
                {
                    "name": "Season 5 Kills",
                    "value": 757,
                    "key": "kills_season_5"
                }
            ],
            "ImgAssets": {
                "icon": "https:\/\/api.mozambiquehe.re\/assets\/icons\/pathfinder.png",
                "banner": "https:\/\/api.mozambiquehe.re\/assets\/banners\/pathfinder.jpg"
            }
        },
        "Wraith": {
            "data": [
                {
                    "name": "Kills",
                    "value": 269,
                    "key": "kills"
                },
                {
                    "name": "Season 5 Wins",
                    "value": 7,
                    "key": "wins_season_5"
                },
                {
                    "name": "Season 5 Kills",
                    "value": 174,
                    "key": "kills_season_5"
                }
            ],
            "ImgAssets": {
                "icon": "https:\/\/api.mozambiquehe.re\/assets\/icons\/wraith.png",
                "banner": "https:\/\/api.mozambiquehe.re\/assets\/banners\/wraith.jpg"
            }
        },
        "Octane": {
            "data": [
                {
                    "name": "Season 5 Kills",
                    "value": 106,
                    "key": "kills_season_5"
                }
            ],
            "ImgAssets": {
                "icon": "https:\/\/api.mozambiquehe.re\/assets\/icons\/octane.png",
                "banner": "https:\/\/api.mozambiquehe.re\/assets\/banners\/octane.jpg"
            }
        },
        "Wattson": {
            "ImgAssets": {
                "icon": "https:\/\/api.mozambiquehe.re\/assets\/icons\/wattson.png",
                "banner": "https:\/\/api.mozambiquehe.re\/assets\/banners\/wattson.jpg"
            }
        }
    }
},

}

以上是 JSON 响应,我希望解码器仅显示图例以及它们在数据数组中的杀伤和伤害。我目前无法访问每个图例下的“数据”数组。

【问题讨论】:

  • 你试过搜索 Stackoverflow 吗?一千个类似的问题。
  • 这只是JSON的一部分,或者你只需​​要解码legends key里面的内部json?

标签: json swift swift4 decoding


【解决方案1】:

您可以使用 Codable 来获得预期的响应。使用以下模型

struct Response: Codable {
    let legends: Legends
}

struct Legends: Codable {
    let all: [String:Legend]
}

struct Legend: Codable {
    let data: [LegendData]?
    
    var kills: Int {
        return self.data?.filter({$0.key.lowercased() == "kills"}).first?.value ?? 0
    }
    
    var damage: Int {
        return self.data?.filter({$0.key.lowercased() == "damage"}).first?.value ?? 0
    }
}

struct LegendData: Codable {
    let value: Int
    let key: String
}

由于您只需要每个Legendkillsdamage 的计数,因此无需解析JSON 中的所有内容。

Legend 模型中,我创建了 2 个计算属性 killsdamage。这些属性将直接返回每个图例的击杀数和伤害数,而无需每次访问它时都编写那么多代码。

现在解析 JSON data 像这样,

do {
    let response = try JSONDecoder().decode(Response.self, from: data)
    response.legends.all.forEach { (name,legend) in
        let kills = legend.kills
        let damage = legend.damage
        print("\(name) - Kills: \(kills), Damage: \(damage)")
    }
} catch {
    print(error)
}

示例输出:

Pathfinder - Kills: 1140, Damage: 257532
Octane - Kills: 0, Damage: 0
Wattson - Kills: 0, Damage: 0
Wraith - Kills: 269, Damage: 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多