Swift

Parse JSON with Swift

JoonSwift 2020. 12. 23. 22:12

JSON?

JSON File Format 또는 JSON이라고 불리는 JSON은 JavaScript Object Notation의 약자입니다.

JSON의 정의를 보면 

'JSON is an open standard file format, and data interchange format, that uses human-readable text to store and transmit data objects consisting of attribute–value pairs and array data types (or any other serializable value).'

즉, 속성 - 값의 쌍과 배열 데이터 타입으로 구성된 데이터 개체를 저장 또는 전송하는 표준 파일 Format이라고 할 수 있습니다.

JSON은 Web을 통해 데이터를 전달하는 Format중 가장 인기있는 Format입니다.

 

How To Use In Swift?

JSON을 Swift언어로 Parsing하기 위해서는 Swift언어로 사용할 데이터 타입을 정의한 후 Codable이라는 타입을 활용하여  타입을 주로 정의합니다. 

 

Codable?

Codable이란

'A type that can convert itself into and out of an external representation.' 

Codable이 붙은 자신을 외부 표현(JSON, ...) 형식으로 변환 하거나, 외부 표현을 자신의 형식으로 변환 시키는 타입 이라고 할 수 있습니다.

typealias Codable = Decodable & Encodable

그래서 Codable이라는 타입은 Decodable이라는 Protocol과 Encodable이라는 Protocol로 이루어져 있습니다.

 

Decodable?

외부 표현 방식을 Swift의 표현 방식으로 decode해주는 타입.

Encodable?

Swift의 표현 방식을 외부 표현 방식으로 encode해주는 타입.

 

이런 JSON을 Swift의 타입으로 옮기면 어떻게 옮겨질 수 있을까요??

"data" 에는 배열이 있고, 각각의 배열에는 "title"과 "items"가 있습니다 표현해 보면

import Foundation

struct Result: Codable {
    let data: [ResultItem]
}

struct ResultItem: Codable {
    let title: String
    let items: [String]
}

 

이렇게 표현될 수 있습니다. 

 

Parsing JSON

이제 타입 정의는 끝났으니 가져오는 일만 남았군요!

JSON을 파싱하는 과정을 살펴보겠습니다.

우선 json파일의 위치를 알아야겠죠? 

이곳의 경로를 코드로 표현해 보면 다음과 같이 표현될 수 있습니다.

        guard let path = Bundle.main.path(forResource: "data", ofType: "json") else {
            return
        }

이후에는 path에 대한 url을 생성한 후 디코딩하는 과정에서 Error 핸들링을 위해 do-catch문을 활용하여 코드를 작성해 보겠습니다.

        let url = URL(fileURLWithPath: path)
        do {
            let dataJSON = try Data(contentsOf: url)
            result = try JSONDecoder().decode(Result.self, from: dataJSON)
        } catch {
            print("Error \(error)")
        }

result라는 파라미터에 Decode한 결과를 넣어주면 파싱이 완료됩니다. 😄

전체 코드의 모습입니다.

피드백은 언제나 환영입니다. 감사합니다!🙏

'Swift' 카테고리의 다른 글

Type Methods (static func & class func)  (0) 2022.03.23
Sequence  (0) 2022.01.28
Unowned?  (0) 2021.02.28
Dispatch(2) : Sync / Async / main / global  (0) 2021.01.13
Dispatch(1) : What is Dispatch and Dispatch Queue?  (0) 2021.01.13