μλ νμΈμ ~
μ€λμ Codableμ λν΄μ μ 리νλ €κ³ ν©λλ€ : )
μ ν κ°λ°μ λ¬Έμλ₯Ό μ°Έκ³ νμλ©΄ μ’μ κ² κ°μ λ§ν¬λ₯Ό 첨λΆν΄ λκ² μ΅λλ€.
Swiftμμ Codable νλ‘ν μ½μ
JSON, Property List λ° κΈ°ν λ°μ΄ν° νν νμμ μ½κ² μΈμ½λ©νκ³ λμ½λ© ν μ μκ² ν΄μ£Όλ νλ‘ν μ½μ λλ€.
Codable νλ‘ν μ½μ Encodableκ³Ό Decodable νλ‘ν μ½μ ν©μ±μ λλ€.
Encodable νλ‘ν μ½μ μΈμ½λ© κ°λ₯ν λ°μ΄ν°λ₯Ό λνλ΄λ λ° μ¬μ©λκ³
Decodable νλ‘ν μ½μ λμ½λ© κ°λ₯ν λ°μ΄ν°λ₯Ό λνλ΄λ λ° μ¬μ©λ©λλ€.
Codable νλ‘ν μ½μ μ¬μ©νλ©΄ λ°μ΄ν° λͺ¨λΈμ λ§λ€κ³ JSON λ°μ΄ν°μ λΉ λ₯΄κ² μνΈ μμ©ν μ μμ΅λλ€.
Encodable
Encodable νλ‘ν μ½μ μΈμ½λ© κ°λ₯ν λ°μ΄ν°λ₯Ό λνλ΄λ λ° μ¬μ©λ©λλ€.
μ¦, κ°μ²΄λ₯Ό JSONμ΄λ λ€λ₯Έ νμμΌλ‘ λ³νν μ μμ΅λλ€.
Encodableμ μ€μνλ κ°μ²΄λ encode(to:) λ©μλλ₯Ό ꡬνν΄μΌ ν©λλ€.
struct Person: Encodable {
let name: String
let age: Int
}
let person = Person(name: "κ²½νΈ", age: 20)
let encoder = JSONEncoder()
let encodedData = try encoder.encode(person)
print(String(data: encodedData, encoding: .utf8)!) // μΆλ ₯: {"name":"κ²½νΈ","age":20}
Decodable
Decodable νλ‘ν μ½μ λμ½λ© κ°λ₯ν λ°μ΄ν°λ₯Ό λνλ΄λ λ° μ¬μ©λ©λλ€.
μ¦, JSONμ΄λ λ€λ₯Έ νμμ λ°μ΄ν°λ₯Ό κ°μ²΄λ‘ λ³νν μ μμ΅λλ€.
Decodableμ μ€μνλ κ°μ²΄λ init(from:) μ΄λμ λΌμ΄μ λ₯Ό ꡬνν΄μΌ ν©λλ€.
struct Person: Decodable {
let name: String
let age: Int
}
let jsonString = """
{
"name": "κ²½νΈ",
"age": 20
}
"""
let jsonData = jsonString.data(using: .utf8)!
let decoder = JSONDecoder()
let person = try decoder.decode(Person.self, from: jsonData)
print(person) // μΆλ ₯: Person(name: "κ²½νΈ", age: 20)
μμ μ½λλ Person κ°μ²΄λ₯Ό JSON λ°μ΄ν°λ‘ μΈμ½λ©νκ³
λ€μ λμ½λ©νμ¬ Person κ°μ²΄λ₯Ό κ°μ Έμ€λ λ°©λ²μ 보μ¬μ£Όλ μμμ λλ€.
μ£Όμμ¬ν
μ£Όμμ¬νμΌλ‘λ Codableμ κΈ°λ³Έ μλ£ν(Int, Double, String λ±)κ³Ό Optionalμ μ§μνμ§λ§, Date, URL λ° Enumμ κ²½μ° μΌλΆ μμ μ ν΄μ€μΌ ν©λλ€.
struct Person: Codable {
let name: String
let age: Int
let email: String
}
let jsonString = """
{
"first_name": "κ²½νΈ",
"age": 20,
"email_address": "fu@example.com"
}
"""
let jsonData = jsonString.data(using: .utf8)!
let decoder = JSONDecoder()
let decodedPerson = try decoder.decode(Person.self, from: jsonData)
μμ μ½λλ μ λλ‘ λμν μ μμ΅λλ€.
JSON λ°μ΄ν°μ "first_name" λ°μ΄ν°μ Person κ°μ²΄μ "name" νλ‘νΌν°μ 맀νλμ§ μκ³ "email_address" λ°μ΄ν°μ "email" νλ‘νΌν°μ 맀νλμ§ μκΈ° λλ¬Έμ λλ€.
μ΄λ΄ λ μ¬μ©νλ κ²μ΄ λ°λ‘ CodingKeyμ λλ€.
CodingKey
Codable νλ‘ν μ½μ μ¬μ©ν λ, μΌλΆ κ²½μ°μλ νλ‘νΌν° μ΄λ¦μ΄ JSON ν€μ μΌμΉνμ§ μμ μ μμ΅λλ€.
μ΄λ¬ν κ²½μ°, CodingKey νλ‘ν μ½μ μ¬μ©νμ¬ λ§€νμ μ μν μ μμ΅λλ€.
CodingKey νλ‘ν μ½μ λ€μκ³Ό κ°μ΄ μ μλ©λλ€.
public protocol CodingKey {
var stringValue: String { get }
init?(stringValue: String)
var intValue: Int? { get }
init?(intValue: Int)
}
CodingKeyλ stringValueμ intValueλΌλ λ κ°μ νλ‘νΌν°λ₯Ό κ°μ§λλ€.
stringValueλ JSON λ°μ΄ν°μ μΌμΉνλ νλ‘νΌν° μ΄λ¦μ λνλ΄λ©°
intValueλ νλ‘νΌν°κ° μ«μλ‘ μΈλ±μ± λλ κ²½μ° μ¬μ©λ©λλ€.
CodingKey νλ‘ν μ½μ μ±ννμ¬ λ§€νμ μ μνλ κ²μ κ°λ¨ν©λλ€.
μ£Όμμ¬νμμ μ¬μ©νλ μμ λ₯Ό ν΅ν΄ μ€λͺ νκ² μ΅λλ€.
struct Person: Codable {
let name: String
let age: Int
let email: String
private enum CodingKeys: String, CodingKey {
case name = "first_name"
case age
case email = "email_address"
}
}
Person κ°μ²΄μ νλ‘νΌν° μ΄λ¦κ³Ό JSON λ°μ΄ν°μ ν€ μ΄λ¦μ΄ λ¬λμ§λ§
CodingKeys μ΄κ±°νμ μ¬μ©νμ¬ λ§€νμ μ μνμ΅λλ€.
맀νμ΄ κ°λ₯νκ² λμ΄
JSONEncoder λ° JSONDecoder μΈμ€ν΄μ€λ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μΈμ½λ©νκ³ λμ½λ©ν μ μμ΅λλ€.
let jsonString = """
{
"first_name": "κ²½νΈ",
"age": 20,
"emailAddress": "fu@example.com"
}
"""
let jsonData = jsonString.data(using: .utf8)!
let decoder = JSONDecoder()
let decodedPerson = try decoder.decode(Person.self, from: jsonData)
μ 리
encode(to:)μ init(from:) λ©μλλ Codable νλ‘ν μ½μ μΌλΆλΆμΌλ‘
Encodable νλ‘ν μ½κ³Ό Decodable νλ‘ν μ½μ΄ κ°κ° κ°μ§κ³ μλ λ©μλμ λλ€.
Encodable νλ‘ν μ½μ μ€μνλ νμ μ κ°μ²΄λ₯Ό JSON λ°μ΄ν°λ‘ μΈμ½λ©νλ €λ©΄, encode(to:) λ©μλλ₯Ό ꡬνν΄μΌ ν©λλ€.
λ°λ©΄, Decodable νλ‘ν μ½μ μ€μνλ νμ μ κ°μ²΄λ₯Ό JSON λ°μ΄ν°μμ λμ½λ©νλ €λ©΄, init(from:) λ©μλλ₯Ό ꡬνν΄μΌ ν©λλ€.
CodingKey νλ‘ν μ½μ μ±νν νμ μ κ°μ²΄λ₯Ό μ¬μ©νμ¬ νλ‘νΌν° μ΄λ¦κ³Ό JSON λ°μ΄ν°μ ν€ μ΄λ¦ κ°μ 맀νμ μ μν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ νλ‘νΌν° μ΄λ¦μ΄ JSON λ°μ΄ν°μ ν€ μ΄λ¦κ³Ό μΌμΉνμ§ μλ κ²½μ°μλ μ½κ² μΈμ½λ© λ° λμ½λ© μμ μ μνν μ μκ² λ©λλ€.
struct Person: Codable {
let name: String
let age: Int
let email: String
private enum CodingKeys: String, CodingKey {
case name = "first_name"
case age
case email = "email_address"
}
}
let person = Person(name: "κ²½νΈ", age: 20, email: "fu@example.com")
// Encode
let encoder = JSONEncoder()
let jsonData = try encoder.encode(person)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString)
// μΆλ ₯: {"name":"κ²½νΈ","age":20,"email_address":"fu@example.com"}
// Decode
let decoder = JSONDecoder()
let decodedPerson = try decoder.decode(Person.self, from: jsonData)
print(decodedPerson.name, decodedPerson.age, decodedPerson.email)
// μΆλ ₯: κ²½νΈ 20 fu@example.com
'iOS > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] λλ μ€νμμ€μ κΈ°μ¬ν΄λ³΄κ³ μΆλ€ (λΌμ΄λΈλ¬λ¦¬ μμ± λ°©λ²) (0) | 2022.02.08 |
---|---|
[Swift] Moyaλ₯Ό μ¬μ©ν΄λ΄ μλ€. (0) | 2022.02.07 |
[Swift] R.swift SPMμΌλ‘ μ€μΉν΄λ³΄κΈ° (0) | 2022.02.06 |
[Swift] Foundation Frameworkμ λν΄μ (0) | 2022.02.05 |
[Swift] URLSessionμ λν΄μ μμ보μ (0) | 2021.12.24 |