본문 바로가기

 𝗔𝗣𝗣𝗟𝗘/SWIFT : GRAMMAR

Swift 기초 문법 - Codable: JSON을 위한 JSON에 대한 Encoding / Decoding

 

 

 

 

 

Codable: JSON을 위한 JSON에 대한 Encoding / Decoding

 

 

 

 

 

목차 접기

Codable: JSON을 위한 JSON에 대한 Encoding / Decoding

 

 

 

 

 

💡 Codable: JSON을 위한 JSON에 대한 Encoding / Decoding

 

Codable에 설명하기 전, JSON에 대해 간략히 알아보자.

 

 

JSON이란?

JavaScript Object Notation (JSON)은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다.

 

 

 JSON 예시  

 {
    "name": "WOOD",
    "age": 24,
    "city": "wood-fxrest"
}

 

위의 예시와 같이 Swift에서 키-값 쌍으로 이루어진 데이터를 전달하고 싶다면 JSON 기본 자료형 → Swift 자료형을 참고하여 아래와 같이 만들어주면 된다.

 

 let array: [String: Any] = { "name": "WOOD", "age": 24, "city": "wood-fxrest" }

 

 

 JSON 기본 자료형 → Swift 자료형 

 

JSON 기본 자료형 Swift 자료형
수 (Number) Int, Double
문자열(String) String
참, 거짓 (Boolean) Bool
배열 (Array) Array
객체 (Object) Dictionary<String, Any>
null nil

 

 

 

Codable이란?

Codable은 네트워크를 통신을 위해 JSON과 같은 데이터 형식으로 변환하거나, 디스크에 저장된 다음 원래 Swift 유형으로 다시 변환할 수 있다.

 

공식 문서를 살펴보면 Codable은 DecodableEncodable로 이루어져 있다고 typealias로 정의되어 있다. 따라서 Codable은 Encoding / Decoding 프로토콜을 준수하는 프로토콜이다.

 

 

그럼 Encoding / Decoding은 뭘까?

 

 

Encoding이란?

→ 간략히 예를 들자면 Swift 데이터 유형을 JSON 또는 기타 외부 데이터 형식으로 변환하는 것이다.

 

 

 예시  

struct UserData: Codable {
    let name: String
    let age: Int
    let city: String
}

// UserData 구조체 인스턴스 생성
let user = UserData(name: "WOOD", age: 30, city: "wood-fxrest")

// JSONEncoder 인스턴스 생성
let encoder = JSONEncoder()

do {
    // UserData를 JSON 형식으로 인코딩
    let jsonData = try encoder.encode(user)

    // 인코딩된 데이터를 문자열로 변환하여 출력
    if let jsonString = String(data: jsonData, encoding: .utf8) {
        print(jsonString)
    }
} catch {
    print("사용자 데이터를 인코딩하는 중 오류 발생: \(error)")
}



 

이때 인코딩된 데이터를 문자열로 변환하여 출력하면,

{
  "age" : 30,
  "name" : "WOOD",
  "city" : "wood-fxrest"
}

 

이렇게 입력한 데이터가 JSON 형식으로 정확히 인코딩된 걸 확인할 수 있다.

 

 

Decoding이란?

→ 간략히 예를 들자면 JSON 또는 기타 외부 데이터 형식을 Swift 데이터 유형으로 변환하는 것이다.

 

 

 예시 

let jsonString = """
{
  "age" : 30,
  "name" : "WOOD",
  "city" : "wood-fxrest"
}
"""

// JSON 데이터를 디코딩할 구조체 정의
struct UserData: Codable {
    let name: String
    let age: Int
    let city: String
}

// JSONDecoder 인스턴스 생성
let decoder = JSONDecoder()

do {
    // JSON 데이터를 디코딩하여 UserData 객체로 변환
    let jsonData = jsonString.data(using: .utf8)!
    let user = try decoder.decode(UserData.self, from: jsonData)

    // 디코딩된 객체 출력
    print("Name: \(user.name), Age: \(user.age), City: \(user.city)")
} catch {
    print("JSON 데이터를 디코딩하는 중 오류 발생: \(error)")
}

 

 

디코딩된 객체 출력해보면,

Name: WOOD, Age: 30, City: wood-fxrest

 

입력한 JSON 데이터가 성공적으로 디코딩되어 Swift 객체로 변환된 걸 확인할 수 있다.

 

 

 

CodingKey이란?

그런데 JSON과 구조체의 변수명이 다르다면?

 

이럴 때는 CodingKey 를 사용해 key 값에 대응하는 이름을 변경해 줄 수 있다. 이때 CodingKey 를 사용해 key 값의 이름을 변경하는 걸 매핑이라고 하는데, 그 예시는 아래와 같다.

 

 

 예시 

struct UserData: Codable {
    let name: String
    let age: Int
    let city: String

    private enum CodingKeys: String, CodingKey {
        case name = "userName"
        case age = "userAge"
        case city = "userCity"
    }
}

 

위 예시에 경우 JSON 키 user\_name, user\_age, user\_city 를 구조체의 name, age, city에 각각 매핑한다. 이렇게 하면 JSON 데이터를 디코딩할 때 JSONDecoder는 이런 사용자 정의 키를 사용하여 key 값이 일치하지 않을 경우에도 JSON 데이터를 디코딩할 수 있다.

 

 

 

 

 

 

 

 

 

 

참고 JSON

참고 Codable

Recent Posts
Visits
Today
Yesterday
Archives
Calendar
«   2024/10   »
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