Codable

냐옹·2024년 7월 12일
0

IOS

목록 보기
19/32

Codable

  • swift4부터 추가된 프로토콜

  • json을 간편하고 쉽게 인코딩 / 디코딩할 수 있게 해준다.

  • EncodingDecodingprotocol이다.

인코딩

  • Codable을 사용해서 JSON으로 인코딩하고 싶다면 반드시 Codable이라는 프로토콜을 준수하고 있어야 한다.
struct Human : Codable {
	var name : String
    var age : Int
}


let Johnson : Human = .init(name : "Johnson", age : 39)
  • 다음으로 Johnson이라는 구조체변수를 인코딩
let data = try? JSONEncoder().encode(Johnson)

// {"name":"Johnson", "age" : "39"}

디코딩

let data = """
{
	"name" : "Johnson",
    "age" : "39"
}
"""
  • 서버에서 위와 같은 데이터를 받았다고 해보자.

  • 이 데이터를 Human구조체 변수에 Decoding하겠다.

let johnson = try? JSONDecoder().decode(Human.self, from : data)

그러면 파싱해서 잘 들어간다.

CodingKey

  • 지금은 구조체 변수의 멤버와 JSON의 키 값이 딱 맞아 떨어져야 파싱이 된다.
  • 이를 지키지 않고, 구조체 변수의 이름을 JSON의 키 값과 다르게 준다면
    Decoding fail로서 nil이 들어간다.
  • 그러나 이를 CodingKey를 사용하여 Key의 이름이 바뀌었다는 걸 명시해서 이름을 바꿔줄 수 있다고 한다.
struct Human : Codable{
	var name : String
}

enum CodingKeys : String, CodingKey{
	case name = "Name"
}
  • 다른 방법도 있다.
  • 상황을 상정하면 특정 Key-value 없이 오는 경우를 들 수 있는데
    아예 오지 않는 경우를 가정해보자. (빈 json)
struct Human : Codable{
	var name : String
}


let data = 
"""
{

}
""".data(using : .utf8)!
  • 만약에 다음과 같이 한다면
let johnson = try? JSONDecoder().decode(Human.self, from : data)
  • 결과는 nil이다.

때문에 이런 경우를 대비하여 2가지 처리를 할 수 있다.

    1. Key가 없을 경우를 대비하여 직접 Decoding함수를 작성한다.
      ㄴ JSON을 decoding할때 init(from decoder : Decoder)가 호출되는데 키가 없을 경우의 기본 값을 세팅해준다.
enum CodingKeys : String, CodingKey{
	case name = "Name"
}

struct Human : Codable{
	var name : String
    
    init(from decoder : Decoder) throws{
    	let values = try decoder.container(keyedBy : CodingKeys.self)
      	name = try? values.decode(String.self, forKey: .name) ?? ""
    }
}
  • 먼저 CodingKeys의 name의 키 값에 맞는 컨테이너를 가져오는데 없다면 nil이 반환된다.
  • 만약에 없어서 nil이 반환되면 try?에 따라서 해당 표현식 역시 nil이 되고 이 경우에 옵셔널 값에 따라서 ""가 문자열 name에 할당되게 된다.
  • Key가 없이 올 경우에는
    1. 변수옵셔널로 선언한다.
struct Human : Codable{
	var name : String?
}

으로 아예 처음부터 옵셔널로 선언하는 방법.

  • 만약에 값에 null이 들어있는 채로 왔다.
    그러면 이 경우에도
let data = try? JSONDecoder().decode(Human.self, from :data)

는 에러가 나서 try?에 따라서 nil을 반환한다.

이런 경우에는 아예 구조체를

struct Human : Codable{
	var name : String?
}

옵셔널로 선언한다.

출처 : https://babbab2.tistory.com/61

0개의 댓글