1. ホーム
  2. json

[解決済み] Swift Codableからプロパティを除外する方法は?

2022-05-13 20:55:37

質問

スウィフトの Encodable / Decodable Swift 4 でリリースされたプロトコルにより、JSON の (デ) シリアル化が非常に快適になりました。しかし、どのプロパティがエンコードされるべきで、どのプロパティがデコードされるべきかを細かく制御する方法はまだ見つかっていません。

私は、プロパティを付随する CodingKeys enum は、そのプロパティをプロセスから完全に除外しますが、もっと細かく制御する方法はないでしょうか?

どのように解決するのですか?

エンコード/デコードするキーのリストを制御するのが CodingKeys (注 s を最後に追加してください)。コンパイラはこれを合成してくれますが、いつでも上書きすることができます。

というプロパティを除外したいとします。 nickname の両方のエンコーディングから を復号化する。

struct Person: Codable {
    var firstName: String
    var lastName: String
    var nickname: String?
    
    private enum CodingKeys: String, CodingKey {
        case firstName, lastName
    }
}


非対称にしたい場合(つまり、エンコードするがデコードしない、またはその逆)は、独自の実装で encode(with encoder: )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, lastName, fullName
    }

    // We don't want to decode `fullName` from the JSON
    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)
    }

    // But we want to store `fullName` in the JSON anyhow
    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)
    }
}