티스토리 뷰

반응형
SMALL

이번 포스트에서는 Swift에서 제공하는 Codable을 사용하여 JSON을 Encode하고 Decode하도록 하겠습니다.

Codable은 Swift 4.x부터 지원하는 Protocol입니다. 공식 문서에 따르면 Codable은

A type that can convert itself into and out of an external representation."

자기 자신을 외부 표현으로 변환(Encode)하거나 외부 표현으로부터 변환(Decode)할 수 있는 타입이라고 합니다.

 

즉, Codable은 Encodable과 Decodable을 합친 것인데, 각각 정의를 살펴보면 아래와 같습니다.

typealias Codable = Decodable & Encodable

Codable은 Protocol 이기 때문에 이를 채택하여 구현해주어야 합니다. 채택이 가능한 형식으로는 class, enum, struct 모두 가능합니다.

아주 간단하게 struct 하나를 정의해보도록 하겠습니다.

struct Address {
	var postCode    : String
    var jibunAddress: String
    var roadAddress : String
}

Codable은 Protocol이기 때문에 채택을 하게 되면 아래 처럼 변환이 되겠죠.

struct Address: Codable {
	var postCode    : String
    var jibunAddress: String
    var roadAddress : String
}

JSON Encoding 하기

자 그럼 이제 외부 표현 (External Representation)으로 변환해야 하는데 이 포스트에서는 JSON 타입을 다뤄보도록 하겠습니다.

방법은 간단합니다. JSONEncoder를 생성하고 Encode하면 됩니다.

let address = Address(postCode: "01234", 
                      jibunAddress: "서울특별시 동작구 상도동", 
                      roadAddress: "서울특별시 동작구 상도로")

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let encodedData = try? encoder.encode(address)

encode 메소드는 아래 공식 문서에서 나온 것과 같이 Data 형을 반환합니다.

위 코드에서 .prettyPrinted라는 것은 출력하게 되면 1줄로 나오게 되는데 이를 보기 좋은 형태로 만들어 주는 옵션을 말합니다.

마치 아래와 같이 말이죠.

{
    "postCode"  : "01234",
    
    "jibunAddr" : "서울특별시 동작구 상도동",
    
    "roadAddr"  : "서울특별시 동작구 상도로"
}

 

그렇기 때문에 이 Data 형을 String으로 변환하고 utf8로 인코딩해주면 보기 좋게 문자로 JSON 형태로 만들어줄 수 있습니다.

if let jsonData = encodedData, 
   let jsonString = String(data: jsonData, encoding: .utf8) {
   
    print(jsonString) // {"postCode":"01234", "jibunAddr":"~~", "roadAddr":"~~"}

}

print를 하게 되면 원하는 대로 잘 나오는 것을 알 수 있습니다.

JSON Decoding

이번에는 반대로 디코딩을 해보도록 하겠습니다. 하는 방법은 인코딩과 유사합니다.

먼저 decoder를 만들어주시고 string을 Data로 변환한 다음 Decode를 진행하면 됩니다.

let decoder = JSONDecoder()
var data = jsonString.data(using: .utf8)

decode 할 때 decode하고자 하는 구조체/클래스/Enum 타입을 지정해주면 자동으로 decode가 이루어집니다.

if let data = data, let address = try? decoder.decode(Address.self, from: data) {

    print(address.postCode)// 01234

    print(address.jibunAddr)// 서울특별시 동작구 상도동
    
    print(address.roadAddr)// 서울특별시 동작구 상도로

}

바로 해당 객체로 파싱이 되고 이를 통해 간편하게 데이터에 접근할 수 있습니다.

 

이번 포스트에서는 Codable를 활용하여 JSON타입 데이터를 Encoding하고 Decoding하는 방법에 대해 알아보았습니다.

반응형
LIST

'프로그래밍언어 > Swift' 카테고리의 다른 글

[Swift] Delegate 패턴 사용하기  (0) 2020.03.13
Swift 클로저 (Closure)  (0) 2020.02.23
Swift 함수  (0) 2020.02.23
Swift 메모리 안정성  (0) 2020.02.16
Swift 제어문 (조건문, 반복문)  (0) 2020.02.14
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함