본문 바로가기

iOS

[iOS] JSON 파일 다루기

인코딩 (Encoding) : 정보의 형태나 형식을 표준화, 처리 속도 향상 등을 위해 다른 형태나 형식으로 변환하는 처리

디코딩 (Decoding) : 인코딩한 정보를 다시 기존의 형태로 변환하는 처리 (인코딩의 반대)

 

 

 

Codable

스위프트는 스위프트의 인스턴스를 다른 형태로 변환하고 그 반대의 역할을 수행하는 방법을 제공한다.

Encodable 프로토콜은 스위프트 타입의 인스턴스를 인코딩할 수 있는 프로토콜이고,

Decodable 프로토콜은 스위프트 타입의 인스턴스로 디코딩할 수 있는 프로토콜이다.

그리고 Codable은 Encodable과 Decodable을 합한 타입을 말한다. 

JSON 파일을 변환할 때 유용하게 인코딩, 디코딩할 수 있다. 

 

Codable 

인스턴스를 다른 데이터 형식으로 변환하고 싶을 때 Codable 프로토콜을 준수하도록 해야 한다.

스위프트의 기본 타입은 대부분 Codable 프로토콜을 준수한다. 

struct Coordinate: Codable {
	var latitude: Double
	var longitude: Double
}

struct Landmark: Codable {
    var name: String
    var foundingYear: Int
    var vantagePoints: [Coordinate]
    var metadata: [String: String]
    var website: URL?
}

 

CodingKey

자주 사용하게 될 JSON 형태의 데이터로 상호 변환하고자 할 때는 기본적으로 인코딩/디코딩할 JSON 타입의 키와 애플리케이션의 사용자 정의 프로퍼티가 일치해야 한다. 만약 JSON의 키 이름을 구조체 프로퍼티의 이름과 다르게 표현하려면 타입 내부에 String 타입의 원시값을 갖는 CodingKeys 라는 이름의 enum을 선언하고 CodingKey 프로토콜을 준수하도록 하면 된다.

CodingKeys 열거형 케이스의 이름은 해당 프로퍼티의 이름과 일치해야 한다. 그리고 프로퍼티의 enum case의 값으로 매칭할 JSON 타입의 키를 할당하면 된다. 타입의 키와 프로퍼티의 이름일 일치한다면 할당하지 않으면 된다. 

struct Landmark: Codable {
    var name: String
    var foundingYear: Int
    var location: Coordinate
    var vantagePoints: [Coordinate]
    
    enum CodingKeys: String, CodingKey {
        case name = "title"
        case foundingYear = "founding_date"
        
        case location
        case vantagePoints
    }
}

 

JSONEncoder / JSONDecoder

스위프트 4 버전 부터 JSONEncoder, JSONDecoder가 Codable 프로토콜을 지원하기 때문에 JSONEncoder, JSONDecoder, Codable 프로토콜을 이용해 손쉽게 JSON 형식으로 인코딩 및 디코딩 할 수 있다. 

 

JSONEncoder

struct GroceryProduct: Codable {
    var name: String
    var points: Int
    var description: String?
}

let pear = GroceryProduct(name: "Pear", points: 250, description: "A ripe pear.")

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted

let data = try encoder.encode(pear)
print(String(data: data, encoding: .utf8)!)

/* Prints:
 {
   "name" : "Pear",
   "points" : 250,
   "description" : "A ripe pear."
 }
*/

 

JSONDecoder

struct GroceryProduct: Codable {
    var name: String
    var points: Int
    var description: String?
}

let json = """
{
    "name": "Durian",
    "points": 600,
    "description": "A fruit with a distinctive scent."
}
""".data(using: .utf8)!

let decoder = JSONDecoder()
let product = try decoder.decode(GroceryProduct.self, from: json)

print(product.name) // Prints "Durian"

 

 

 

 

 

[LECTURE] 2) JSONEncoder / JSONDecoder : edwith

 JSONEncoder / JSONDecoder 스위프트에서 JSON을 읽고 쓸 수 있는 JSONEncoder와 JSONDecoder 에 대해 알아봅니다. 학습 목표 1. JSON... - 부스트코스

www.edwith.org

 

'iOS' 카테고리의 다른 글

[iOS] iOS에서 체크박스 사용하기  (0) 2020.07.13
[iOS] NotificationCenter  (0) 2020.06.14
[iOS] CMTime  (0) 2020.06.13
[iOS] AVFoundation, AVPlayer, AVPlayerLayer  (0) 2020.06.13
[iOS] AVKit, AVPlayerViewController  (0) 2020.06.13