# iOS | Swift/--- SwiftUI

SwiftUI Tutorials_ Json Parsing

jiniz.ll 2022. 10. 26. 19:11

 

KavSoft 채널의 튜토리얼에 대한 내용을 하나씩 해보면서 SwiftUI에 대해 공부해보려고 합니다.

따라서 이 글은 위 튜토리얼에 대한 정리 글입니다.

 

  • Xcode 14.0.1
  • iOS 16.0

 

이번 내용은 json 데이터를 읽어 리스트 형태로 보여주는 것을 학습한다.

이번 내용에 사용되는 데이터와 관련 패키지는 다음과 같다.

** 코드는 일부 수정하여 영상과 조금 다를 수 있다.

 

json 데이터로 부터 받아올 데이터 모델을 먼저 정의한다.

** Identifiable을 사용하는 경우 id 속성이 반드시 필요하며, 이 경우 List에서 id 값을 전달하지 않아도 된다.

** 받아진 데이터 타입을 디코딩하기 위해서는 Decodable 을 채택하고 각 속성의 이름을 json 데이터의 키 값과 동일하거나 CodingKey를 정의해주어야 한다.

struct Data: Identifiable, Decodable {    
    var id: Int
    var login: String
    var node_id: String
    var avatar_url: String
}


// 만약 변수명을 json key와 다르게 하고 싶다면 다음과 같이 구현할 수 있다.

struct Data: Identifiable, Decodable {
    
    var id: Int
    var login: String
    var nodeID: String
    var avatarURL: String
    
    enum CodingKeys: String, CodingKey {
        case id, login
        case nodeID = "node_id"
        case avatarURL = "avatar_url"
    }
}

 

이번 예제에 사용할 json 파일의 데이터를 읽어 [Data] 타입으로 변환하는 클래스이다.

ObservableObject 프로토콜을 채택하면 해당 클래스의 인스턴스를 관찰하고 있다가 값이 변경되면 뷰를 업데이트 한다.

** 이때 ObservableObject는 클래스에서만 사용할 수 있다.

Published를 사용하면 해당 속성이 변경되는 경우 뷰가 업데이트 된다.

class DataParser: ObservableObject {
    
    @Published var jsonData = [Data]()
    
    private let url = "https://api.github.com/users/hadley/orgs"
    
    init() {
        let session = URLSession(configuration: .default)
        
        session.dataTask(with: URL(string: url)!) { (data, _, _) in
            do {
                let fetch = try JSONDecoder().decode([Data].self, from: data!)
                
                DispatchQueue.main.async {
                    self.jsonData = fetch
                }
            }
            catch {
                print(error.localizedDescription)
            }
        }.resume()
    }
}

 

ListView에 보여질 Row뷰를 정의한다.

AnimatedImage는 SDWebImageSwiftUI SDWebImage를 베이스로 하는 이미지 로딩 프레임워크에서 제공하는 기능이다.

말 그대로 gif 같은 움직이는 이미지를 가져와 보여줄 때 사용할 수 있다. 

** 자세한 사용법은 위 링크되어 있는 깃헙에 들어가 확인가능하다.

import SDWebImageSwiftUI

struct ListRow: View {
    
    var url: String
    var name: String
    
    var body: some View {
        HStack {
            AnimatedImage(url: URL(string: url))
                .resizable()
                .frame(width: 60, height: 60)
                .clipShape(Circle())
                .shadow(radius: 20)
            
            Text(name)
                .fontWeight(.heavy)
                .padding(.leading, 10)
        }
    }
}

 

이제 최종적으로 json 데이터를 읽은 뒤 해당 데이터를 List 뷰로 보여줄 수 있다.

** ObservedObject는 ObservableObject를 구독하고 값이 업데이트될 때 마다 뷰를 갱신하는 propertyWrapper이다.

struct JsonParse: View {
    
    @ObservedObject var parser = DataParser()
    
    var body: some View {
        NavigationView {
            List(parser.jsonData) { data in
                ListRow(url: data.avatarURL, name: data.login)
            }
        }
    }
}

 

'# iOS | Swift > --- SwiftUI' 카테고리의 다른 글

SwiftUI Tutorials_ Context Menu  (0) 2022.11.16
SwiftUI Tutorials_ Search Bar  (0) 2022.11.15
SwiftUI Tutorials_ TopBar Style TabView  (0) 2022.11.09
SwiftUI Tutorials_ TabView  (0) 2022.10.31
SwiftUI Tutorials_ GridView  (0) 2022.10.26