JSON과 Codable 알아보기

고라니·2023년 8월 2일
0

TIL

목록 보기
18/67

iOS 개발에서 데이터를 교환할 때 JSON 형식을 많이 사용한다. Swift에서는 이러한 JSON 데이터를 다루기 위해 'Codble'이라는 프로토콜을 제공하고 있다. 이 두개념과 어떻게 사용하는지 알아보겠다.

JSON?

JSON(JavaScript Object Notation)은 데이터를 교환하는 형식 중 하나로, 가볍고 간단한 구조를 가지고 있다.

  • Key-Value쌍: Swift의 'Dictionary'와 유사하며, 이를 JSON 오브젝트라고 부른다.
{
    "name": "John Doe",
    "age": 30,
    "city": "Seoul"
}
  • 값들의 리스트: Swift의 'Array'와 유사하며, 이를 JSON 배열이라고 부른다.
["Apple", "Banana", "Cherry"]

JSON 값으로는 여러 데이터 타입이 표현될 수 있따.
(숫자, 문자열, 불리언, 배열, 오프젝트, null)

  • 숫자 Number (ex: 9, 10, 4.95)
  • 문자 String (ex: "Hello World")
  • 불리언 Boolean (ex: true, false)
  • 배열 list (ex: [1, 2, 3, 4, 5])
  • 오브젝트 Object (ex: {""name": "jiwoo""})
  • null (Swift의 nil과 같은 의미)

JSON 중첩표현

JSON의 오브젝트와 배열은 중첩될 수 있어서 복잡한 데이터 구조를 표현하는데 매우 유용하다.

{
    "name": "John Doe",
    "age": 30,
    "pets": ["Cat", "Dog"],
    "address": {
        "city": "Seoul",
        "country": "South Korea"
    }
}

Key인 'pets'는 배열을 vlaue로 가지고 있고, 'address'는 다른 JSON 오브젝트를 값으로 가지고 있다. 이런 중첩표현은 게층적이고 복잡한 데이터 구조를 표현하는 데 유용하다.

Codable?

Codable은 typealias를 사용하여 Decodable과 Encodable 두개의 프로토콜을 합친것으로 데이터를 쉽게 인코딩하고 디코딩하기 위한 프로토콜이다.

  • Encodable :이 프로토콜을 준수하는 타입은 자신의 데이터를 외부 표현으로 인코딩할 수 있다.

  • Decodable: 이 프로토콜을 준수하는 타입은 외부 표현에서 데이터를 디코딩하여 자신의 인스런트를 생성할 수 있다.

Codable은 이 두개의 프로토콜의 인코딩과 디코딩이 모두 가능하다는 것이다. 이 프로토콜을 통해 JSON데이터 같은 형식으로부터 객체를 쉽게 만들고 쉽게 변환할 수 있다.

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 인스턴스로 변환할 수 있다.

CodingKey

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데이터를 잘 처리할 줄 알아야 한다.

profile
🍎 무럭무럭

2개의 댓글

comment-user-thumbnail
2023년 8월 2일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

1개의 답글