JSON 파싱 (feat. Codable, Codingkey)

hoBahk·2021년 12월 16일
0

안녕하세요
오늘은 저번 글에 이어 Codable, Codingkey에 대해서 공부해보겠습니다.

Codable

먼저 공식문서를 보겠습니다.

"자신을 변환하거나 외부표현으로 변환할 수 있는 타입이다."라는 설명이 있네요.

Declaration을 보시면,
Decodable프로토콜과 Encodable프로토콜을 포함한 typealias라는 것을 알 수 있습니다.

Decodable프로토콜은 디코딩할 때 사용하고 Encodable프로토콜은 인코딩 할 때 사용하겠죠?

Codable은 Class, Struct, Enum에서 모두 사용할 수 있습니다.

지난편의 예제를 가져오겠습니다.

struct User: Codable {
    let userId: Int
    let name: String
    let emailAddress: String
}

Codable을 채택하여 struct를 만들어 주었습니다.
만약에 인코딩만 한다? 그러면 Encodable프로토콜만 채택하여 사용할 수 있습니다.
반대로 디코딩만 한다면 Decodable프로토콜만 채택하여 사용할 수 있겠네요!

이렇게 만들어주면 됩니다. 쉽죠?

이제 CodingKey에 대해서 알아보겠습니다.

그리고 저번 예제 약간 다른 JSON파일을 만들었습니다.

struct User: Codable {
    let userId: Int
    let name: String
    let emailAddress: String
}
{
    "user_id": 1,
    "user_name": "Kale",
    "user_emailAddress": "kale@test.com"
}

struct의 프로퍼티 이름과 JSON의 키값이 같다면 그대로 사용하면 되지만 위처럼 서버에서 던져주는(서버에서 JSON형식을 던져준다고 가정) 키값이 swift의 네이밍 가이드에 맞지 않는다면 이름을 변경하여 사용하여야 하겠죠.

이럴 때 Codingkey를 사용하면 좋습니다.

struct User: Codable {
    let userId: Int
    let name: String
    let emailAddress: String
    
    enum CodingKeys: String, CodingKey {
        case userId = "user_id"
        case name = "user_name"
        case emailAddress = "user_emailAddress"
    }
}

struct안에서 enum을 선언하여 Codingkey를 채택해줍니다.
rawValue를 사용하기 위해 String도 적어줍니다.
그리고 case에는 프로퍼티와 같은 이름을 적어주고 rawValue로 JSON에 설정되어 있는 키값을 적어줍니다.

여기서 enum의 이름을 Codingkeys로 하지 않으면 프로퍼티과 매핑이 되지 않는 것으로 보입니다.
이유는 아직 찾지 못했네요.. 알고 계신분이 있다면 알려주세요!!

위와 같이 CodableCodingkey를 사용하면 JSON의 키값과 타입의 프로퍼티를 매핑시켜줄 수 있습니다.
JSON 디코딩 하는 방법은 지난 편에 있습니다!
JSON파일 Decode하기 (feat. Codable)

감사합니다.

profile
호박에 줄 그어서 수박 되는 성장 드라마

0개의 댓글