iOS 개발에서 데이터를 교환할 때 JSON 형식을 많이 사용한다. Swift에서는 이러한 JSON 데이터를 다루기 위해 'Codble'이라는 프로토콜을 제공하고 있다. 이 두개념과 어떻게 사용하는지 알아보겠다.
JSON(JavaScript Object Notation)은 데이터를 교환하는 형식 중 하나로, 가볍고 간단한 구조를 가지고 있다.
{
"name": "John Doe",
"age": 30,
"city": "Seoul"
}
["Apple", "Banana", "Cherry"]
JSON 값으로는 여러 데이터 타입이 표현될 수 있따.
(숫자, 문자열, 불리언, 배열, 오프젝트, null)
JSON의 오브젝트와 배열은 중첩될 수 있어서 복잡한 데이터 구조를 표현하는데 매우 유용하다.
{
"name": "John Doe",
"age": 30,
"pets": ["Cat", "Dog"],
"address": {
"city": "Seoul",
"country": "South Korea"
}
}
Key인 'pets'는 배열을 vlaue로 가지고 있고, 'address'는 다른 JSON 오브젝트를 값으로 가지고 있다. 이런 중첩표현은 게층적이고 복잡한 데이터 구조를 표현하는 데 유용하다.
Codable은 typealias를 사용하여 Decodable과 Encodable 두개의 프로토콜을 합친것으로 데이터를 쉽게 인코딩하고 디코딩하기 위한 프로토콜이다.
Encodable :이 프로토콜을 준수하는 타입은 자신의 데이터를 외부 표현으로 인코딩할 수 있다.
Decodable: 이 프로토콜을 준수하는 타입은 외부 표현에서 데이터를 디코딩하여 자신의 인스런트를 생성할 수 있다.
Codable은 이 두개의 프로토콜의 인코딩과 디코딩이 모두 가능하다는 것이다. 이 프로토콜을 통해 JSON데이터 같은 형식으로부터 객체를 쉽게 만들고 쉽게 변환할 수 있다.
struct Person: Codable {
var name: String
var age: Int
}
let json = """
{
"name": "John",
"age": 30
}
""".data(using: .utf8)!
let jsonDecoder = JSONDecoder()
var person: Person?
guard let jsonData =
do {
let user = try JSONDecoder().decode(User.self, from: json)
print(user.firstName) // 출력: "John"
} catch {
print("디코딩 실패: \(error)")
}
Person 구조체는 Codable을 준수하고 있다. JSONDecoder().decode(_:from:) 메서드를 사용하여 JSON 데이터를 Person 인스턴스로 변환할 수 있다.
JSON을 디코딩 할때는 속성 이름이 동일해야 한다고 했다. 하지만 Swift와 JSON의 스타일 차이로 Swift 스타일과 맞지 않는 속성의 이름을 디코딩 해야할 때가 있다.
CodingKey 프로토콜을 채택한 열거형을 정의하면 각 케이스를 Swift스타일의 속석이름에 맞게, 그리고 연관 값으로 JSON의 키를 지정하여 사용할 수 있다.
{
"first_name": "John",
"age": 30
}
Swift에서는 'first_name'처럼 사용하지 않고 'firstName'으로 많이 사용한다. CodingKey를 이용해보자
struct Person: Codable {
var firstName: String
var age: Int
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
case age
}
}
CodingKey 프로토콜을 채택한 CodingKeys 열거형은 firstName 케이스에 "first_name"으로 연관값으로 JSON 키의 값을 지정하여 디코딩할 때 원하는 속성 이름 지정이 가능하다.
JSON과 Codable에 대해 알아보았따. JSON 형식의 데이터 처리는 iOS개발에서 자주 사용하기 때문에 이 두 개념을 잘 이해하여 JSON데이터를 잘 처리할 줄 알아야 한다.
감사합니다. 이런 정보를 나눠주셔서 좋아요.