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은 Decodable
과 Encodable
로 이루어져 있다고 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
' 𝗔𝗣𝗣𝗟𝗘 > SWIFT : GRAMMAR' 카테고리의 다른 글
Swift 기초 문법 - allSatisfy() (0) | 2024.03.30 |
---|---|
Swift 기초 문법 - 타입 메서드(Type Method) in 스태틱(Static) (2) | 2024.03.27 |
Swift 기초 문법 - 제네릭(Generic) (2) | 2024.03.15 |
Swift 기초 문법 - 확장(Extension) (0) | 2024.03.14 |
Swift 기초 문법 - 프로토콜(Protocol) (0) | 2024.03.14 |