아리의 iOS 탐구생활

[Swift/iOS] Codable로 JSON을 파싱해보자. 본문

Swift/iOS

[Swift/iOS] Codable로 JSON을 파싱해보자.

Ari Lee 2021. 8. 22. 16:55
반응형

🔍 Codable이 뭘까?

 Codable은 Decodable와 Encodable를 준수하는 타입(프로토콜)이다.

 JSON 데이터를 간편하고 쉽게 인코딩 & 디코딩 할 수 있게 해준다.

typealias Codable = Decodable & Encodable

구조체, 클래스, 열거형 모두 Codable을 채택할 수 있다.

 

 

 

먼저 JSON 인코딩 디코딩을 하는데 이용할 타입을 만들어주고 Codable 채택하자.

struct Person: Codable { // Codable 프로토콜 채택
    var name: String
    var age: Int
}

 

 

 

 

👉🏻  JSON 만들기 (Encoding)

  •  JSONEncoder를 선언한다.
  •  JSONEncoder의 encode메소드를 사용하여 인스턴스를 Data타입으로 만든다.
      open func encode<T>(_ value: T) throws -> Data where T : Encodable
  •  Data타입을 String타입으로 만든다.

 

let encoder = JSONEncoder() // encoder 선언
encoder.outputFormatting = [.sortedKeys, .prettyPrinted] // 출력스타일 설정
let ari = Person(name: "Ari", age: 27) // encode하고 싶은 인스턴스 생성
let jsonData = try? encoder.encode(ari) // encode안에 올수 있는 값은 Encodable를 준수하고 있는 타입만 가능하다.
// encode중에 에러를 발생할 수 있기 때문에 try를 반드시 함께 써줘야 한다.

//jsoData는 옵셔널이다. 따라서 옵셔널바인딩을 통해서 값을 출력해주었다. jsonString도 마찬가지로 옵셔널타입이다.
if let jsonData = jsonData, let jsonString = String(data: jsonData, encoding: .utf8) {
    print(jsonString)
}
/* 출력예시
{
  "age" : 27,
  "SeverName" : "Ari"
}
*/

 

 

 

 

실제로 가장 많이 사용하는 것은 이 Decoding이다.

 

👉🏻  JSON 파싱 (Decoding)

  •  JSONDecoder를 선언한다.
  •  JSON. 즉 String타입을 Data타입으로 만든다
      open func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable
  •  Data타입을 JSONDecoder의 decode메소드를 사용하여 인스턴스로 만든다.

 

// 이것을 서버가 준 JSON 데이터라고 생각하자.
let jsonString = """ 
{
  "age" : 27,
  "name" : "Ari"
}
"""
let decoder = JSONDecoder() // decoder 선언
var data = jsonString.data(using: .utf8) // String 타입을 data로 바꿔준다.

// 옵셔널바인딩을 통하여 data를 인스턴스로 디코딩하는 작업.
// 마찬가지로 디코딩중 실패할 수 있기 때문에 반드시 try랑 함께 써준다.
if let data = data, let myPerson = try? decoder.decode(Person.self, from: data) {
    print(myPerson.name)
    print(myPerson.age)
}

 

 

 

🔍  CodingKey란?

서버에서 내려주는 키 값이 달라도 정상적으로 파싱할 수 있게 도와주는 프로토콜

 

struct Person: Codable { // Codable 프로토콜 채택
    var name: String
    var age: Int
    
    enum CodingKeys: String, CodingKey { // enum을 통해 CodingKey 채택.
        case name = "SeverName"
        case age
    }
}

let jsonString = """
{
  "age" : 27,
  "SeverName" : "Ari" 
}
"""
// SeverName이라는 키값으로 정상적으로 파싱이 되는걸 볼 수 있다.
let decoder = JSONDecoder() // decoder 선언
var data = jsonString.data(using: .utf8) // String 타입을 data로 바꿔준다.

// 옵셔널바인딩을 통하여 data를 인스턴스로 디코딩하는 작업.
if let data = data, let myPerson = try? decoder.decode(Person.self, from: data) {
    print(myPerson.name)
    print(myPerson.age)
}

 

✔️  Reference

 

Apple Developer Documentation

 

developer.apple.com

 

반응형
Comments