Swift 4 以变量为关键解析 json

西亚瓦什

我试图了解 Apple 添加的新 Codable 功能,但我无法解决这个问题。我有一个像这样的 json 输出

{
    "Afpak": {
        "id": 1,
        "race": "hybrid",
        "flavors": [
            "Earthy",
            "Chemical",
            "Pine"
        ],
        "effects": {
            "positive": [
                "Relaxed",
                "Hungry",
                "Happy",
                "Sleepy"
            ],
            "negative": [
                "Dizzy"
            ],
            "medical": [
                "Depression",
                "Insomnia",
                "Pain",
                "Stress",
                "Lack of Appetite"
            ]
        }
    }
}

我有一个结构就像

struct Strain: Codable {
    var name: String
    var id: Int
    var race: String
    var flavors: [String]
    var effects: [String: [String]]

}

所以显然它会失败,因为我的 json 中没有 name 键。名字应该是“Afpak”,我环顾四周,但大多数教程没有给出任何关于如何解决这个问题的例子,他们只是做了[String:Strain]这不是我需要的。反正有没有将我的字典的键设置为我的 name 变量?

大卫牧羊人

您可以使用一个小技巧来解决未知的关键问题:为您的Strain结构创建一个辅助结构,制作该辅助结构Codable,将响应解码为[String:Helper],然后创建一个带有 2 个输入参数、应变名称和Helper实例。

通过这种方式,您可以将 存储name为 的属性,Strain并且不需要过于复杂的解码来规避未知顶级Dictionary密钥的问题。

struct Strain {
    var name: String
    var id: Int
    var race: String
    var flavors: [String]
    var effects: [String: [String]]

    init(from helper: StrainHelper, with name:String){
        self.name = name
        self.id = helper.id
        self.race = helper.race
        self.flavors = helper.flavors
        self.effects = helper.effects
    }
}

struct StrainHelper: Codable {
    var id: Int
    var race: String
    var flavors: [String]
    var effects: [String: [String]]
}


do {
    let strainHelper = try JSONDecoder().decode([String:StrainHelper].self, from: data)
    guard let strainName = strainHelper.keys.first else {throw NSError(domain: "No key in dictionary",code: 404)}
    let strain = Strain(from: strainHelper[strainName]!, with: strainName)
} catch {
    print(error)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章