티스토리 뷰

[iOS BoostCourse] JSONEncoding & JSONDecoding


학습에 대한 내용은 Edwith에서 제공하는 iOS 부스트코스를 공부하면서 참고한 것입니다. [관련 강의]

JSONEncoderJSONDecoder에 대해서는 익히 많이 들어봤습니다. 서버로부터 데이터를 받아올 때 json을 필히 다루게 되는데 사실 지금까지 저는 다음과 같은 방식으로 데이터를 파싱해왔습니다.

다음은 졸업 작품으로 진행중인 비콘을 활용한 프로젝트 코드의 일부입니다. 서버로부터 매장들의 비콘 식별 값들을 받아올 때 Alamofire를 이용해서 json 데이터를 받아오는 상황입니다. 단순하다면 단순할 수 있는 코드이지만 만일 받아오는 값이 많아진다면 상당히 귀찮은 작업이 될 것입니다. 그럼에도 불구하고 저는 위의 방법을 고수해왔습니다.


하지만 부스트코스를 통해 JSONEncoderJSONDecoder을 제대로 익혀보았고 이를 저의 프로젝트에 적용시켜가며 소개해드리도록 하겠습니다.


JSONEncoder & JSONDecoder

저는 사실 이전에 이 둘과 거의 비슷한 PropertyListEncoderPropertyListDecoder 에 대해 공부해보았는데요. 이에 대한 내용은 저의 다른 글을 참고해주시기 바랍니다. 사실상 거의 사용법이 비슷하기 때문에 먼저 해당 글을 읽고 오신다면 훨씬 도움이 될 것 같습니다.


먼저 이전 방법을 사용할 때 사용했던 모델 구조체를 살펴보도록 하겠습니다.


그리고 여기에 JSONEncoderJSONDecoder를 사용하기 위해 Codable 프로토콜을 명시해주겠습니다.

그리고 JSONEncoderJSONDecoder를 사용하면 json 데이터를 담게 될 모델 데이터 타입에 매핑을 하게 되는데 이때 json의 키 값과 이를 담는 모델 데이터 타입의 프로퍼티 이름이 반드시 일치해야 합니다. 그리고 json의 키에 해당하는 값이 존재하지 않을 수도 있기 때문에 저는 항상 옵셔널 타입으로 지정합니다.


그리고 json 키에 해당하는 프로퍼티만 명시할 수 있는 것은 아닙니다. 다른 용도의 프로퍼티도 명시할 수 있으며 매핑 과정이 일어날 때 자동으로 해당 프로퍼티는 제외되고 매핑됩니다.


또한 만일 원하는 프로퍼티 명을 사용해주기 위해서는 CodingKey 프로토콜을 사용한 String 타입을 원시 값을 사용하는 Enums 를 사용하면 됩니다. 이를 적용한 코드는 다음과 같습니다.


이렇게 변경된 Store 구조체에 서버에서 받아온 데이터들을 매핑시켜보도록 하겠습니다.

어떠신가요? 기존에 제가 사용했던 방법보다 훨씬 간결해진 것을 확인하실 수 있습니다. 그리고 저는 Store 객체의 배열로 저장할 것이기 때문에 [Store].self를 통해 Store 객체 배열의 메타데이터로 명시해주었습니다.


마지막으로 저의 프로젝트에서는 json 데이터 타입으로 인코딩해야하는 상황은 없지만 이를 간단히 코드로 구현해보면 다음과 같습니다.


마무리

오늘은 이렇게 json 데이터를 쉽게 파싱하고 생성할 수 있는 JSONEncoderJSONDecoder에 대해 공부해보았습니다. 오늘은 굉장히 기초적인 내용을 다루어보았고 다음에는 보다 복잡한 json 데이터를 파싱하는 방법을 다루어보도록 하겠습니다. 감사합니다.


Source : github


참고자료


  1. iOS Boostcourse


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함