使用Codable解析嵌套的JSON

时间:2018-11-10 00:40:31

标签: json swift

因此,我正在尝试在Swift中使用Codable解析看起来像这样的JSON。

{
"abilities": [
    {
        "ability": {
            "name": "chlorophyll",
            "url": "https://pokeapi.co/api/v2/ability/34/"
        },
        "is_hidden": true,
        "slot": 3
    },
    {
        "ability": {
            "name": "overgrow",
            "url": "https://pokeapi.co/api/v2/ability/65/"
        },
        "is_hidden": false,
        "slot": 1
    }
],
"name": "SomeRandomName"
}

现在,当您尝试获取嵌套数据时,它会造成混乱。现在,我正在尝试获取名称,这很容易。我也在尝试获得能力名称,这对我来说很复杂。经过研究,这就是我想出的。

class Pokemon: Codable {

struct Ability: Codable {
    var isHidden: Bool

    struct AbilityObject: Codable {
        var name: String
        var url: String
    }

    var ability: AbilityObject

    private enum CodingKeys: String, CodingKey {
        case isHidden = "is_hidden"
        case ability
    }
}

var name: String
var abilities: [Ability]
}

现在有什么更好的方法可以执行此操作,否则我会坚持这样做吗?

1 个答案:

答案 0 :(得分:1)

获取您的JSON响应并将其转储到this site中。

它将在没有0x00007fff的情况下生成这些结构。添加Codable,使它们看起来像这样:

Codable

对于带有struct Pokemon: Codable { let abilities: [AbilityElement] let name: String struct AbilityElement: Codable { let ability: Ability let isHidden: Bool let slot: Int struct Ability: Codable { let name: String let url: String } } } 的键,您只需声明一个snake_case并将JSONDecoder指定为keyDecodingStrategy。如果您只是从蛇皮箱转换而来,则无需弄乱编码键。仅在重命名密钥时才需要它们。

如果您在其他情况下需要为响应创建自定义编码密钥或更改密钥名称,那么this page应该很有帮助。

您可以将其丢弃在操场上并玩耍:

.convertFromSnakeCase