본문 바로가기
YAGOM CAREER STARTER

[TIL] 20230220: JSON

by Rhode 2023. 2. 21.

본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.


JSON(JavaScript Object Notation)

속성-값 쌍, 배열 자료형 혹은 기타 모든 시리얼화 가능한 값 혹은 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 특히, 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다. 어떤 객체를 0과 1로만 저장해 놓으면 읽고 쓰는 방식이 컴퓨터마다 달라 그 객체를 불러오기 어려울 수 있다. 컴퓨터와 컴퓨터 사이에도 0과 1로 변환하는 규칙이 필요하고, JSON은 약속된 표준의 0과 1이다. JSON은 다른 컴퓨터와 데이터를 주고받는 약속이기도 하면서 사람이 읽고 쓰기에 쉽게 한 것이기도 하다. 즉, 특정 메모리에 있는 객체를 사람도 읽기 편하고 컴퓨터끼리도 읽기 편하게 만든 약속이라고 볼 수 있다. JSON의 공식 인터넷 미디어 타입은 application/json이며, JSON의 파일 확장자는 .json이다.

 

JSON의 형식

JSON은 다음과 같은 형식을 띈다:

{}: 객체(딕셔너리)
[]: 배열
"": 문자열
문자열 외: 숫자

 

JSON decoding

JSON을 디코딩하는 법은 간단하다:

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)

우선 struct를 생성해주고 Codable을 채택해준다. 이 때, 인코딩이 필요 없다면 Decodable을 채택해줘도 좋다. struct 안에는 사용할 변수명들이 들어가게 된다. 이 때, JSON의 변수명이 swift에 적합하지 않은 snake case로 이루어져있다면, enum을 통해 이름을 재정의해줘야한다. 재정의하는 법은 다음과 같다:

struct Accessory: Decodable {
    var name: String
    var brandName: String
    var shortDescription: String
    var description: String
    
    private enum CodingKeys: String, CodingKey {
        case name
        case brandName = "brand_name"
        case shortDescription = "short_desc"
        case description = "desc"
    }
}

변수명을 선언한 아래에 enum을 구현하고, case 뒤에는 실질적으로 swift에서 사용할 이름을, rawValue에는 원래 JSON 파일에 있던 이름을 쓰면 된다.

그리고 나서 JSONDecoder를 decoder등의 이름으로 정의해주고, 정의한 decoder를 사용해주면 된다. 이 때, decode(A, from: B)에서 A의 자리에는 타입이 들어가 줘야하고, B의 자리에는 data가 들어가줘야한다. 만약 JSON이 배열의 형태를 띄고 있다면, [GroceryProduct].self와 같이 배열의 형태의 타입이 들어가줘야한다.