Codableメモ

CodingKeys について

  • CodingKey プロトコルに準拠する必要がある。

  • シリアル化されたデータで使用されるキーがプロパティ名と一致しない場合、String を指定することで、特定のプロパティの名前を変更することができる。

struct Pokemon: Codable {
    var id: Int
    var name: String

    enum CodingKeys: String, CodingKey {
        case id = "pokedex_number"
        case name
    }
}

JSON 出力は以下のようになります。

{"name":"Bulbasaur","pokedex_number":1}

手動でエンコードとデコード

上記の例の Pokemon 構造体の Codable への準拠を削除して、以下の extension を追加します。

extension で必要なメソッド encode(to:)init(from:) を実装します。

extension Pokemon: Codable {
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(Int.self, forKey: .id)
        name = try container.decode(String.self, forKey: .name)
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(id, forKey: .id)
        try container.encode(name, forKey: .name)
    }
}

let encoder = JSONEncoder()
let decoder = JSONDecoder()
let p = Pokemon(id:1, name:"Bulbasaur")
let jsonData = try encoder.encode(p)
let jsonStr = String(data: jsonData, encoding: .utf8)!
print(jsonStr)
let pokemon = try decoder.decode(Pokemon.self, from: jsonData)
print(pokemon)

Tags:

Updated: