본문 바로가기

MOBILE/ios

[iOS] Codable protocol을 사용하여 json data parsing하기

swift에서 json 데이터를 parsing 할 수 있는 방법은 여러가지이다.

그 중에서도 swift4 에 출시된 codable은 코드 단 5줄 이내로도 쉽게 json 데이터를 파싱할 수 있도록 해준다. 이에 대해 알아보자

 

애플 공식 문서를 살펴보면 codable은 type alias라고 되어있다.

즉 Codable = encodable + decodable 이다.

 

 

원래 swift에는 decodable, encodable 프로토콜 두가지를 모두 제공하였다. 이를 합친것이 codable이다.

이때 데이터를 encode, decode 한다는 것은 다음과 같은 의미이다.

encode: 데이터를 원하는 프로토콜로 변환

decode: 데이터를 내가 사용하고자 하는 모델로 캐스팅

 

json을 예시로 들자면 다음과 같다.

nsarray를 json으로 변환 -> encode

json을 nsarray로 변환 -> decode

 

Codable을 이용하면 별다른 조정 없이도 자동으로 원하는 데이터의 형식에 맞춰준다.

다음 예시를 보자.

 

json 데이터가 서버에 있다 생각하고 이를 parsing 해서 menu struct에 담고 싶은 경우 다음과 같이 변환하고 싶은 데이터의 구조체에 Codable protocol을 채택해야 한다.

 

struct menu: Codable
{
    var name: String
    var favorite: String
    var price: Int
}

 

이때 json 형태로 변환하고자 할때는 키와 사용자가 정의한 프로퍼티가 일치해야 한다.

일치 하지 않는 경우에는 CodingKey 를 사용하여 프로퍼티에 대한 json 데이터의 key name을 컴파일러에게 알려줘야 한다.

 

 

데이터를 가져올 때에는 JSONDecoder 객체를 사용한다.

 

let dataModel = try JSONDecoder().decode(menu.self, from: data)

 

이 객체의 decode 메소드를 사용하면 진짜 코드 한줄로 json 데이터가 파싱이 끝난다... 어이없을 정도로 쉽다.

 

 

친절하게도 애플 공식 문서에 설명과 함께 사용하는 방법이 나와있다.

다음은 decode 메소드에 대한 설명이다.

 

 

decode method의 첫번째 인자는 json 데이터를 받아서 변환하고자 하는 데이터 T의 type이다.

이때 T는 구조체이든 클래스이든 Decodable protocol 을 채택하고 있어야 한다.

하지만! codable은 decodable + encodable 이므로 codable을 채택하고 있으면 굳이 두가지 프로토콜을 다 적을 필요가 없다.

 

두 번째 인자는 decode할 대상이 되는 JSON 객체이다.

이를 이용하여 저녁 메뉴를 JSON 형태로 만들어두고 이를 decode 해보자.

import UIKit
import Foundation


struct menu: Codable
{
    var name: String
    var favorite: String
    var price: Int
}

let json =  """

{
    "name": "연어 덮밥",
    "favorite": "yes",
    "price": 9000
}

"""

let data = json.data(using: .utf8)!

do
{
    let dataModel = try JSONDecoder().decode(menu.self, from: data)
    print(dataModel)
}
catch let e as NSError
{
    print("json error: \(e.localizedDescription)")
}

 

결과는 다음과 같이 json 데이터가 parsing 되어 struct안에 들어가있다.