티스토리 뷰

파싱을 하기 위해서 만들어진 아주 아름다운 녀석입니다.

Mirror를 이용하여 값을 가져와서 자동으로 매핑하도록 하게 되어있죠.

굿...

 

하지만 기존까지는 CodingKey를 이용하여서 snake를 camel로 변경하여서 개발을 하였던 적이 있었습니다.

나온지는 오래되었지만 아직 모르는 분들이 많아서 해당 부분을 정리하려고 합니다.

 

1. useDefaultKeys : 기본적인 동작 방법입니다.

2. convertFromSnakeCase : 만약 키가 스네이크로 되어 있으면 카멜로 변경하여서 매핑하여 줍니다.

3. custom([CodingKey]) -> CodingKey) : 사용자 지정하는 방법으로 가능하게 합니다.

 

1번과 2번은 그냥 정의 해주면 되는데  custom은 정리를 하여야 합니다.

 

사용방법은?

decoder.keyDecodingStrategy = .convertFromSnakeCase

이런식으로 그냥 지정하여 주면 됩니다.

 

그렇다면 custom의 경우는 어떨까요?

 

일단 CodingKey를 상속받은 struct를 하나 만들어 줍니다.

struct AnyKey : CodingKey {
    var stringValue: String
    var intValue: Int?
    
    static var keyNotFound = AnyKey(stringValue: "")!
    }

    init?(stringValue: String) {
        self.stringValue = stringValue
        self.intValue = nil
    }

    init?(intValue: Int) {
        self.stringValue = String(intValue)
        self.intValue = intValue
    }
}

그리고 나서 이것을 사용하는 방법입니다.

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .custom { keys -> CodingKey in
    let key = keys.last?.stringValue
        .split(separator: "_")
        .enumerated()
        .map { $0.offset > 0 ? $0.element.capitalized : $0.element.lowercased() }
        .joined() ?? ""
    
    return AnyKey(stringValue: key) ?? AnyKey.keyNotFound
}

예로 만들어 드린 부분은 convertFromSnakeCase를 만들어준겁니다.

언더바를 기준으로 잘라내고 각 잘라진 0번지는 대문자로 나머지는 소문자로 변경하는 겁니다.

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함