코딩

Swift 공공데이터 parsing 본문

Swift

Swift 공공데이터 parsing

ssooyn_n 2021. 7. 9. 04:24

https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15081240 

 

공공데이터활용지원센터_코로나19 예방접종 위탁의료기관 조회서비스

전국 코로나19 예방접종 위탁의료기관 정보입니다. 위탁의료기관의 주소, 연락처, 운영시간 등을 제공하고 있습니다. 해당 데이터는 질병관리청이 관리하는 위탁의료기관과의 계약정보를

www.data.go.kr

코로나19 예방접종 위탁의료기관 조회서비스데이터 swift로 불러오기

 

 

 

1. JSON데이터 불러오기

   override func viewDidLoad() {
        if let url = URL(string:"사이트제공주소") {
            let request = URLRequest.init(url: url)
            
            URLSession.shared.dataTask(with: request) {
                (data, response, error) in guard let data = data else {return}
                let decoder = JSONDecoder()
                print(response as Any)
                do{ let json = try decoder.decode(hospitalData.self , from: data)
                     print(json)
                }
                catch{
                    print(error)
                }
            }.resume()   
        }
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}

URLSession.shared.dataTask(with: request) 을 해주면 사이트로 부터 data, request 그리고 error 유형을 불러올 수 있다. 

우리가 Codable을 이용하여 출력하고자 하는 데이터는 data지만, 요청이 잘 되었는지 어떤 에러가 발생했는지 확인을 하기 위해서는 

위와 같이 response와 error 또한 확인해주면서 Build를 해주는것이 좋다.

데이터를 성공적으로 불러왔을 때의 reponse

response는 1.URL 2.Status Code 3.Header 에 대한 정보를 담고있다.

URL

위의 코드에서 Url로 써준 부분이며, serviceKey= 뒷부분은 내가 할당받은 개인고유키를 써주면 된다.

 

Status Code

200  성공적으로 수행됨
400, 401  인증정보가 정확하지 않음 
500 API 서버에 문제가 발생하였음

위의 코드는 StatusCode: 200이므로 성공적으로 데이터를 불러 왔음을 알 수 있다.

꼭 StatusCode가 200인지 확인하고 다음단계로 넘어가야한다****

 

Header

파일에 대한 정보를 알 수 있다.

 

 

2. JSON파일 Decode

  do{ let json = try decoder.decode(hospitalData.self , from: data)
                     print(json)
                }
                catch{
                    print(error)
                }

hospitalData: url로 불러온 JSON파일의 규격에 맞춘 struct

 

사이트에서 제공하는 JSON파일의 구조

 

JSON파일을 읽어주기 위해서, Xcode의 프로젝트 안에 이와 똑같은 구조를 가진 struct를 만들어 주어야한다.

//hospitalData.swift
import Foundation

struct hospitalData: Decodable{
    let currentCount: Int
    let data: [Data]
}

struct Data: Decodable{
    var orgcd: String
    var orgnm: String
    var orgTlno: String
    var orgZipaddr: String
    var slrYmd: String
    var dywk: String
    var hldyYn: String
    var lunchSttTm: String
    var lunchEndTm: String
    var sttTm: String
    var endTm: String
}

일단, '기본적으로' 동일한 struct를 만들어 주었다. 하지만 이를 작동시키면

"Expected String value but found null instead."

 error가 출력된다. 이는 JSON에 lunchSttTm: null인 정보가 있지만, null값에 대한 아무런 조치를 취하지 않았다는것

이는 간단하게 String뒤에 ?를 추가하여 해결해줄 수 있다.

struct Data: Decodable{
    var orgcd: String
    var orgnm: String
    var orgTlno: String
    var orgZipaddr: String
    var slrYmd: String
    var dywk: String
    var hldyYn: String
    var lunchSttTm: String?
    var lunchEndTm: String?
    var sttTm: String?
    var endTm: String?
    }

 

3. 출력화면

 

data는 배열로 접근할 수 있다.

 do{ let json = try decoder.decode(hospitalData.self , from: data)
                    for d in json.data{
                        print(d)
                    }
                }

 

'Swift' 카테고리의 다른 글

Swift combination구현  (0) 2021.07.01
Swift 딕셔너리에서 값 가져오기  (0) 2021.06.30
Swift String 자르기  (0) 2021.06.30
Xcode playground 사용하기 (+문제점)  (0) 2021.06.29
Comments