JSON <-> Swift 간의 상호작용

ulls12·2024년 1월 5일
0

Swift TIL

목록 보기
28/60

Decodable 프로토콜

  • 데이터를 객체로 디코딩할 때 사용한다. 외부 데이터(JSON)를 Swift의 데이터 모텔로 변환하는데에 필요한 프로토콜이다.
  • Decodable을 준수하는 객체는 외부 데이터를 해석하고 그 데이터를 객체의 프로퍼티로 매핑할 수 있어야 한다
  • 아래의 CodingKeys 는 디코딩 할 때, 프로퍼티들에 대한 매핑을 제공하는 역할을 한다.
struct User: Decodable {
	let id: Int
    let name: String
    // and so on...
    public enum CodingKeys: String, CodingKey {
    	case id = "key"
        case name
    }
    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)
        //id라는 프로퍼티의 디코딩 키를 key로, name의 프로퍼티의 디코딩 키를 프로퍼티 이름과 동일하게 지정한다
    }
}

Encodable 프로토콜

  • 객체를 데이터로 인코딩할 때 사용한다. Swift의 데이터 모델을 외부 데이터(JSON)로 변환하는데에 필요한 프로토콜이다
  • Encodable을 준수하는 객체는 객체의 프로퍼티를 외부 데이터 형식(JSON)으로 인코딩할 수 있어야 한다
  • 아래의 CodingKeys 는 인코딩 할 때, 프로퍼티들에 대한 매핑을 제공하는 역할을 제공한다
struct User: Encodable {
	let id: Int
    let name: String
    //and so on...
    public enum CodingKeys: String, CodingKey {
    	case id = "key'
        case name
    }
    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)
        //id라는 프로퍼티의 인코딩 키를 key로, name 프로퍼티의 인코딩 키를 프로퍼티 이름과 동일하게 지정함
    }
}

Codable 프로토콜

public typealias Codable = Decodable & Encodable

JSON -> Swift 데이터 모델 & Swift 데이터 모델 -> JSON

struct User: Codable {
	let id: Int
    let name: String
}
	public enum CodingKeys: String, CodingKey {
    	case id = "key"
        case name
    }
    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)
    }
    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)
     }
 }

JSON -> Model 변환

Data Model 작성 -> URLSession으로 받은 Data 타입을 JSONDecoder 클래스를 사용하여 데이터를 모델 객체로 디코딩한다

do {
	let user = try JSONDecoder().decode(User.self, from: data)
   print("디코딩한 사용자: \(user)")
} catch {
	print("디코딩 에러: \(error)")
}
  • JSONDecoder().decode(_:from:) 메서드를 사용하여 JSON 데이터를 User 모델 객체로 디코딩한다
    만약 디코딩을 실패하면 catch 블록에서 에러를 처리할 수 있다
profile
I am 개발해요

0개의 댓글