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)