티스토리 뷰

반응형


안녕하세요 :) Zedd입니다.

오늘은...Codable의 두번째 시간/?...저도 못다뤄본 기능이 많아서 zzzz

굉장히 다뤄보고 싶어요 키키

저번시간엔 기본적인 Codable의 사용법? 그러니까 JSON으로 만들어내고, JSON을 파싱하고 그런 간단한 걸 해봤는데..

오늘은 CodingKey에 대해서 알아봅시다.




왕초보를 위한 Codable  - CodingKey



자..CodingKey가 뭐냐...

예를들어서!!! Swift에서는 변수나 상수같은경우에, 소문자 카멜케이스를 사용하죠? 근데!!! 근데 우리의 JSON은 그게 아닌겁니다.. 예를들어 뭐 스네이크 케이스를  사용한다고 생각해볼게요. 


  1. let jsonString = """

    {


    "name" : "Zedd",


    "age" : 100,


    "birth_date" : "2017-01-22T23:16:50+0000"


    }

    """


저렇게요!! 그냥 예제를 위해 일단 만들었는데..그 birth_date를 보시면 스네이크 케이스로 되어있죠? 

Codable이 JSON을 만들고 파싱하는데는 모두 Key이름을 사용한답니다. 


  1. struct Person : Codable{

        var name : String

        var age : Int

        var birthday : Date

    }


그런데..우리의 Person 구조체는 "birth_date"가 아니라 birthday라고 이름이 되어있네요!!!

만약에..우리가 이 Person타입으로 위 jsonString을 decode하게 되면..



이러한 에러를 만납니다. 

(어떤 에러가 난다는 걸 보여드리기 위해 try!로 했지만..이러시면 안돼요.. 항상 try?를 하도록 합시다.)


보니까 No value associated with key birthday (\"birthday\")."라고 하네요. 

"Key가 birthday인게 없는데??????"라는 거죠.

그러면 어떡하냐...

JSON Key이름들을 나를 위해서..다 바꿔야 하는것이냐...


이럴때를 위해 CodingKey가 존재합니다 :)


CodingKey도 역시 Codable과 마찬가지로 Protocol입니다!!


인코딩 및 디코딩을 위한 키로 사용할 수있는 타입입니다.라고 하네요. :)

어떻게 사용하는지 봅시다.



  1. struct Person : Codable{

        var name : String

        var age : Int

        var birthday : Date


        enum CodingKeys : String, CodingKey{

            case name

            case age

            case birthday = "birth_date"

        }

    }



먼저 JSON에서 Key는 항상 String이니까!! Raw Value타입으로 String타입을 선택한 것을 볼 수 있고!!!!! CodingKeys라는 enum이 CodingKey라는 프로토콜을 채택했네요

그러면 알아서!!!!! 아주 착하게도 알아서 

"아 birth_date는 birthday로 넣어주면 되겠구나~~"라는 것을 알게됩니다. 이제 다시 해볼까요? 



...해보면



아까와는 다른 오류가 나게 되는데요..

어쩌구 저쩌구 하다가 "Double의 디코딩을 예상했지만, 대신 문자열 / 데이터를 찾았습니다."라고..하는 것을 볼 수 있어요. 

그도 그럴게 사실 JSONSerialization. 즉, Codable이 나오기 전에는 


  1. struct Person : Codable{

        var name : String

        var age : Int

        var birthday : Date


    }




이렇게 Date타입을 주지않고, String으로 먼저 받은 다음에 그걸 Fomatter를 이용해서 Date타입으로 바꿨었죠.

ObjectMapper라이브러리를 쓴다면




이런식으로 Transform을 해줬구요.

Codable에서는!!!!만약 JSON이 표준 Date포맷과 일치하기만 한다면!!!!! 알아서 Date타입으로 바꿔주긴 합니다만...

코드 한줄을 넣어줘야 합니다 :)


  1. let decoder = JSONDecoder()

    decoder.dateDecodingStrategy = .iso8601


바로 이코드죠.

dateDecodingStrategy은 별거없습니다. 말그대로 JSON객체의 일부에서 Date를 디코딩할 때 사용되는 전략을 뭐로 할거야?!?입니다.



전략은 굉장히 많죠?  우리의 Date를 잠깐 봅시다.


  1. "birth_date" : "2017-01-22T23:16:50+0000"


이거였는데 이게 iso8601포맷이라고 해요.



출처 : http://dinesql.blogspot.kr/2015/05/sql-server-brain-basher-of-week-010.html


오 언제 한번 저 DateDecodingStrategy가 어떤 차이점이 있는지 써볼게요!!! 궁금

> 글 썼어요! 

그러니까 나는 iso8601포맷을 사용해서 JSON디코딩을 하고싶어!를 말해주는거죠.

이제 코드를 실행하면!!


  1. if let data = data, let myPerson = try? decoder.decode(Person.self, from: data){

            print(myPerson.name)//Zedd

            print(myPerson.age)//100

            print(myPerson.birthday)//2017-01-22 23:16:50 +0000

    }


이렇게 잘 나오게 된답니다 :)

오늘은..CodingKey가 주제였는데....암튼 CodingKey가 이런 역할을 한다~~는 걸 아시면 됩니다.

이렇게해서 Codable의 모든 프로토콜을 봤습니다!! Codable자체가 Encodable과 Decodable이었고..마지막 프로토콜이 이 CodingKey였어요 :) 키키


반응형

'Swift' 카테고리의 다른 글

Swift ) API Design Guidelines  (0) 2018.01.25
Swift ) DateDecoding(Encoding)Strategy  (1) 2018.01.23
Swift ) NSCountedSet  (2) 2018.01.22
Swift ) Access Control(접근제어) - (2)  (1) 2018.01.17
Swift ) Sequences와 Lazy  (2) 2018.01.16