144 votes

Comment exclure des propriétés de Swift 4's Codable

Swfit 4 de nouveau Encodable / Decodable protocoles font JSON (de) sérialisation tout à fait agréable. Cependant, je n'ai pas encore trouvé le moyen d'avoir un contrôle précis sur les propriétés qui devraient être codées et celles qui devraient être décodées.

J'ai remarqué qu'exclure la propriété de l'accompagnement CodingKeys enum exclut complètement la propriété du processus, mais existe-t-il un moyen d'avoir un contrôle plus fin?

243voto

Zoff Dino Points 5010

La liste des clés pour encoder/décoder est contrôlée par un type appelé' CodingKeys. Le compilateur est capable de synthétiser pour vous, mais peut toujours remplacer.

Disons que vous ne voulez pas pour encoder/décoder la propriété nickname:

struct Person: Codable {
    var firstName: String
    var lastName: String
    var nickname: String?

    private enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
    }
}

Cela exclut nickname sur le codage et le décodage.


Si vous voulez qu'il soit asymétrique (c'est à dire coder mais pas décoder ou vice versa), vous devrez fournir vos propres implémentations de encode(with encoder: ) et init(from decoder: ):

struct Person: Codable {
    var firstName: String
    var lastName: String

    // Since fullName is a computed property, it's excluded by default
    var fullName: String {
        return firstName + " " + lastName
    }

    private enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
        case fullName
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        firstName = try container.decode(String.self, forKey: .firstName)
        lastName = try container.decode(String.self, forKey: .lastName)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(firstName, forKey: .firstName)
        try container.encode(lastName, forKey: .lastName)
        try container.encode(fullName, forKey: .fullName)
    }
}

4voto

Si nous devons exclure le décodage d'un couple de propriétés d'un grand ensemble de propriétés dans la structure, déclarez-les en tant que propriétés facultatives. Code pour décompresser les options est moins que d’écrire beaucoup de clés sous CodingKey enum.

0voto

Patru Points 1151

Tout cela peut être fait, au final, il finit par être très unSwifty et même unJSONy. Je crois voir d'où vous venez, le concept de l' #ids est répandue dans le code HTML, mais il est rarement transporté sur le monde de l' JSON que je considère comme une bonne chose (TM).

Quelques - Codable des structures seront en mesure d'analyser votre JSON le fichier très bien si vous avez le restructurer récursive à l'aide de tables de hachage, c'est à dire si votre recipe seulement contient un tableau de l' ingredients qui à son tour contient une (ou plusieurs) ingredient_info. De cette façon, l'analyseur va vous aider à broder votre réseau, en premier lieu, et vous n'avez qu'à fournir certains liens par l'intermédiaire d'un simple traversée de la structure , si vous avez vraiment besoin d'eux. Puisque cela nécessite une profonde refonte de votre JSONet votre structure de données je ne esquisser l'idée pour vous de penser à elle. Si vous le jugez acceptable s'il vous plaît dites-moi dans les commentaires, alors je pourrais élaborer davantage, mais selon les circonstances, vous ne pouvez pas être à la liberté de changer l'un d'eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X