Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views :

[Swift] keyDecodingStrategy

/
/
/
186 Views

Swift 4.1에서 JSONDecoder에 keyDecodingStrategy 이 추가되었다는 기쁜 소식입니다. keyDecodingStrategy을 어떻게 사용하는지 테스트를 하면서 설명해 보자.

  • useDefaultKeys: 키 이름을 변경하지 않는 디폴트 전략입니다.
  • convertFromSnakeCase: 이름에 볼 수 있듯이 snake-case에서 camel-case로 자동으로 변환해 준다.
  • custom: 원하는 키로 CodingKey를 변환할 수 있다.

case convertFromSnakeCase

위와 같은 JSON 형태가 있습니다. JSON API에 따라 다르지만 snake-case 를 사용하는 곳이 많이 있습니다.

JSON을 파싱하기 위해 Person 모델을 만들었습니다.
CodingKeys 를 구현해서 camel-case로 변환을 했습니다. 그렇게 어렵지 않고 간단하지만 모델이 많으면 많아질 수록 짜증나는 일이죠.

keyDecodingStrategy 을 .convertFromSnakeCase 으로 설정하면 간단히 camel-case 로 디코딩이 가능합니다.

“aaa_bbb_ccc” 은 “aaaBbbCcc” 로 변환이 됩니다.
“_aaa_bbb_ccc_” 은 “_aaaBbbCcc_” 로 변환이 됩니다.
키값의 처음과 끝의 _ 는 변환이 안되는 점에 주의하자.

case custom(@escaping ([CodingKey]) -> CodingKey)

JSON API 에서 위와 같은 형태의 JSON을 전달해 주면 어떻게 처리해야할까?
생각만 해도 짜증난다. snake-case 도 아니고 어정쩡 하다.
당장 서버 개발자에게 찾아가서 snake-case로 바꿔달라고 요청을 해야할까?

이때는 keyDecodingStrategy 를 커스텀하게 바꿔서 임의의 CodingKey 로 변환해서 사용하는게 가장 최선이라고 생각한다.

CodingKey 프로토콜을 구현한 PersonKey 구조체를 정의 한다. 그리고 원하는 형태의 key 값으로 변환해서 CodingKey 를 전달해 주면 된다.

“first-name” > “firstName” 키값으로 변환하기 위해 자체적으로 camel-case 변환하는 로직을 구현했다.

만약 “first-Name” 이었다면 간단히 아래와 같이 키값으로 변환하면 된다.
let key = keys.last!.stringValue.split(separator: “-“).joined()

Leave a Comment

이메일은 공개되지 않습니다.

This div height required for enabling the sticky sidebar